Re: [問題] 如何用C#寫一個動態陣列?
: 這樣不行
: 觀念還不是很清楚
: 推 tomex:看起來ok 03/24 00:59
: 推 tomex:不過list<>要用add()把值塞進去,未配大小時就充值不行 03/24 01:01
: 推 rahim:所以是改成arr.Add(new List<double>()); 03/24 04:02
: → rahim:下面改成arr[i].Add(i+j); 這樣以後就可以用arr[i][j]了嗎? 03/24 04:03
: → rahim:還有想請問一下List< >中間要放的是什麼? 03/24 04:04
: → rahim:為什麼我一開始用 03/24 04:05
: → rahim:List<List<double>> arr=new List<List<double>>(); 03/24 04:06
: → rahim:這樣可以呢?(雖然是我自己想出來的,不過想聽一下講解) 03/24 04:07
: as tomex say
: 這種資料結構都要先Add()東西之後你才能去作給值得動作
: List<List<double>> arr = new List<List<double>>();
: 這句話代表arr這個List裡放的是另一個List
: < >裡頭就是這個大箱子裡頭的型別的意思
: 而裡頭的那個List<double>代表這個List裡面放的是double
: 跟ArrayList最大的不同點在於
: ArrayList無論你丟什麼東西進去他都先幫你轉成object
: 所以你要取值的時候也只能拿到object
: 造成你必須要先強制Cast成你需要的資料型別後才能使用
: eg. ArrayList myarr = new ArrayList();
: myarr.Add(1);
: int a = (Int32)myarr[0];
: 所以List<>效率好
: (先規定好要放什麼資料就不需要去作Object型別的轉換)
: 但是ArrayList彈性高
: (你可以亂放任何不同種類的東西進去,只要你取用的時候Cast成你想要的東西就可以)
: 而當你作 arr.Add(new List<double>()); 這個動作時
: 就代表將arr放進一個新的 List<double>
: 這時候arr[0]才確實存在在這個arr裡
: 你若是還沒有Add就去作 arr[0] = new List<double>();
: 這裡的 "=" 有給值或是Modify的意思
: 你還沒給他東西的實體你怎麼去modify他或是給值呢?
: 當然會有錯誤
: 就像有人命令你
: 將Arr第0號箱子裡的紅蘋果塗成綠色
: 你這樣Arr[0] = "green" 這樣一定錯
: 蘋果都還沒放進去怎麼上色
: 你當然得先
: Arr.Add(new Apple("red"));
: 才能去作
: Arr[0] = "green";
: 這樣去想就對了
: 所以你的程式應該這樣寫
: List<List<double>> arr = new List<List<double>>();
: for (int i = 0; i < m; i++)
: {
: //arr[i] = new List<double>();錯誤
: arr[i].Add (new List<double>()); //正確
: for (int j = 0; j < n; j++)
: {
: //arr[i][j] = i + j;錯誤
: arr[i].Add(i+j); 正確
: ps. 其實以上這一行arr[i].Add(i+j)就等於以下兩行
: arr[i].Add(new double());
: arr[i][j] = i + j;
: //不過你要注意
: //你的List裡頭是double
: //但是i+j是int
: //系統這裡不會告知你 自己作轉換
: //這種型別匹配錯誤的問題要小心
: //很多Bug就是在這種地方出來
: }
: }
: 其實你可以自己多try
: try久就懂了
: 如果你用的是VisualStudio就可以自己去Compile看看
: 然後執行時下中斷點讓程式停住
: 然後去看區域變數裡頭的arr裡頭的值對不對
: 像這個程式你還可以去觀察一下arr.Capacity這個屬性
: 你會發現他一直在有規律的長大
: 摸熟了這個資料結構的運作方式跟細節
: 以後你用起來自然得心應手
: 我相信這些MSDN都有寫吧
: 你可以深入研究一下
對了 如果我想把動態陣列當作class A的data member,下面這樣子寫可以嗎?
class A
{
public List<List<T>> arr = new List<List<T>>();
public A()
{
List<List<T>> arr = new List<List<T>>();
for (int i = 0; i < 10; i++)
{
arr.Add(new List<T>());
for (int j = 0; j < 10; j++)
{
arr[i].Add(new T());
}
}
}
}
上面這樣寫完以後,以後要存取動態陣列裡面的東西
是像 A a=new A();
a.arr[i][j]就可以用了嗎?
還有如果T是一個struct
ex: struct T
{
public int n;
public T
{
n=10;
}
}
如果我想要存取T裡面的n的話 n其實是a.arr[i][j].n嗎?
我的目的:是想要10個大盒子裡面,各裝10個小盒子
而每個小盒子裡面,又裝著一個袋子T(我用struct來寫)
袋子T裡面可以裝很多東西
請問我上面這樣寫好嗎?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.119.144.40
推
03/26 23:21, , 1F
03/26 23:21, 1F
→
03/26 23:22, , 2F
03/26 23:22, 2F
推
03/27 02:02, , 3F
03/27 02:02, 3F
推
03/29 03:26, , 4F
03/29 03:26, 4F
→
03/29 03:27, , 5F
03/29 03:27, 5F
→
03/29 03:28, , 6F
03/29 03:28, 6F
→
03/29 03:29, , 7F
03/29 03:29, 7F
推
03/29 03:32, , 8F
03/29 03:32, 8F
討論串 (同標題文章)
完整討論串 (本文為第 13 之 13 篇):
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章