C_Sharp 板


LINE

  : 這樣不行 : 觀念還不是很清楚 : 推 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
1F:推 GreatShot:你為什麼不自己try try 去compile看看呢..^^; 03/26 23:21
2F:→ GreatShot:看到error message就會知道錯哪裡了啊 XD 03/26 23:22
3F:推 rahim:一開始有錯@@ 後來終於改好了^^ 03/27 02:02
4F:推 rahim:後來覺得袋子T用class寫好像比較好 03/29 03:26
5F:→ rahim:我用struct寫 像arr[i][j].XXX=000 這種東西(寫在class中) 03/29 03:27
6F:→ rahim:但compile不給我過 改用class寫後 就給我過了 03/29 03:28
7F:→ rahim:也不知道為什麼@@ 03/29 03:29
8F:推 rahim:它說無法修改xxx的傳回值 因為不是變數型別 03/29 03:32







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP