Re: [問題] 如何用C#寫一個動態陣列?

看板C_Sharp (C#)作者 (我要拿Ph.D.!!!)時間18年前 (2007/03/24 05:17), 編輯推噓8(806)
留言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,
看起來ok
03/24 00:59

03/24 01:01,
不過list<>要用add()把值塞進去,未配大小時就充值不行
03/24 01:01

03/24 04:02,
所以是改成arr.Add(new List<double>());
03/24 04:02

03/24 04:03,
下面改成arr[i].Add(i+j); 這樣以後就可以用arr[i][j]了嗎?
03/24 04:03

03/24 04:04,
還有想請問一下List< >中間要放的是什麼?
03/24 04:04

03/24 04:05,
為什麼我一開始用
03/24 04:05

03/24 04:06,
List<List<double>> arr=new List<List<double>>();
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
想請問一下 為什麼arr.Add(new double())要用new呢?
03/24 10:46, 1F

03/24 10:47, , 2F
arr[i].Add()裡面要裝的 不是只有double嗎?
03/24 10:47, 2F

03/24 10:48, , 3F
而double的型態不是物件 那為什麼要new double呢?
03/24 10:48, 3F

03/24 10:48, , 4F
另外謝謝你跟tomex大 你們讓我學到很多!!
03/24 10:48, 4F

03/24 10:53, , 5F
其實不用這麼作 我只是舉例給你看而已
03/24 10:53, 5F

03/24 10:53, , 6F
因為裡頭不一定放的是double 也許是你自訂的物件
03/24 10:53, 6F

03/24 10:54, , 7F
至於double是不是物件請參閱2500
03/24 10:54, 7F

03/24 11:06, , 8F
謝謝 2500那篇講得很清楚
03/24 11:06, 8F

03/24 11:08, , 9F
Add()括號中間可以直接給值 這樣就等於做物件初始化
03/24 11:08, 9F

03/24 11:09, , 10F
如果不直接給值 double在C#也算是物件 所以要new double()
03/24 11:09, 10F

03/24 13:54, , 11F
Add(new double())和 Add(0)一樣意思, 寫 Add(0)就好了
03/24 13:54, 11F

03/25 10:14, , 12F
其實也不用為了物件導向而去牽就OO的寫法, 有時C式寫法還
03/25 10:14, 12F

03/25 10:16, , 13F
簡潔的多.
03/25 10:16, 13F

03/25 10:41, , 14F
arr.Add(i+j)就好了 OO寫法是讓新手知道原理
03/25 10:41, 14F
文章代碼(AID): #1614FfQU (C_Sharp)
討論串 (同標題文章)
文章代碼(AID): #1614FfQU (C_Sharp)