Re: [問題] 如何用C#寫一個動態陣列?
看板C_Sharp (C#)作者GreatShot (我要拿Ph.D.!!!)時間18年前 (2007/03/24 05:17)推噓8(8推 0噓 6→)留言14則, 4人參與討論串10/13 (看更多)
※ 引述《rahim (forget it)》之銘言:
: ※ 引述《rahim (forget it)》之銘言:
: : System.Collections.Generic裡面的類別
: : 跟ArrayList比較接近的 是List泛型類別嗎?
: : http://msdn2.microsoft.com/zh-tw/library/6sh2ey19(VS.80).aspx
: 如果想要依照使用者輸入的要求
: 建立一個m X n的動態陣列
: 那下面這樣寫可以嗎?
: Console.WriteLine("Please input the row size of matrix");
: int m =Convert.ToInt32(Console.ReadLine());
: Console.WriteLine("Please input the column size of matrix");
: int n = Convert.ToInt32(Console.ReadLine());
: List<List<double>> arr = new List<List<double>>();
: for (int i = 0; i < m; i++)
: {
: arr[i] = new List<double>();
: for (int j = 0; j < n; j++)
: {
: arr[i][j] = i + j;
: }
: }
這樣不行
觀念還不是很清楚
推
03/24 00:59,
03/24 00:59
推
03/24 01:01,
03/24 01:01
推
03/24 04:02,
03/24 04:02
→
03/24 04:03,
03/24 04:03
→
03/24 04:04,
03/24 04:04
→
03/24 04:05,
03/24 04:05
→
03/24 04:06,
03/24 04:06
→
03/24 04:07,
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都有寫吧
你可以深入研究一下
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.133.110.47
※ 編輯: GreatShot 來自: 220.133.110.47 (03/24 05:34)
推
03/24 10:46, , 1F
03/24 10:46, 1F
→
03/24 10:47, , 2F
03/24 10:47, 2F
→
03/24 10:48, , 3F
03/24 10:48, 3F
→
03/24 10:48, , 4F
03/24 10:48, 4F
推
03/24 10:53, , 5F
03/24 10:53, 5F
→
03/24 10:53, , 6F
03/24 10:53, 6F
→
03/24 10:54, , 7F
03/24 10:54, 7F
推
03/24 11:06, , 8F
03/24 11:06, 8F
推
03/24 11:08, , 9F
03/24 11:08, 9F
→
03/24 11:09, , 10F
03/24 11:09, 10F
推
03/24 13:54, , 11F
03/24 13:54, 11F
推
03/25 10:14, , 12F
03/25 10:14, 12F
推
03/25 10:16, , 13F
03/25 10:16, 13F
推
03/25 10:41, , 14F
03/25 10:41, 14F
討論串 (同標題文章)
完整討論串 (本文為第 10 之 13 篇):
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章