2014-10-10 57 views
0

這是我第一次使用集合和Im在這裏停留,我做了一個測試項目來檢查它,我遇到一個問題,我不知道如何解決。在C#中的列表中列出的列表#

首先,我要特別做列表(不能使用別的),是具有整數列出了各大榜單裏面,像這樣:

List<List<int>> Allnums = new List<List<int>>(); 

的數字我想添加到以前的清單收集在這裏:

List<int> nums = new List<int>(); 

到目前爲止,這麼好。

我需要無限期的時間列表(NUMS)添加到我的專業名單(Allnums),所以我不能創建nums1,nums2,NUM3 ...等

好吧,讓我們嘗試添加一個隨機數NUMS: (只有1個,現在數量)

Random rnd = new Random(); 
    private void button1_Click(object sender, EventArgs e) 
    { 
     nums.Add(rnd.Next(10)); 
    } 

現在,讓我們保存已生成的數量和清除NUMS列出新的一個新的號碼在下一次存儲(讓店裏只有4所列出)。

private void button2_Click(object sender, EventArgs e) 
    { 
     Allnums.Add(nums); //adds the minor list to the major list. 
     nums.Clear(); //clears the minor list to accept new values. 
    } 

讓檢查與此代碼的結果:

private void button3_Click(object sender, EventArgs e) 
    { 
     listBox1.Items.Clear(); 
     listBox1.Items.Add("Number of lists entered: " + Allnums.Count); 
     foreach (List<int> numList in Allnums) 
     {  
      listBox1.Items.Add("----------"); //separator to divide the lists 
      foreach(int number in numList) 
      { 
       listBox1.Items.Add(number); 
      } 
     } 
    } 

我得到這個:

Number of lists entered: 4 //OK 
---------- //List1: nothing 
---------- //List2: nothing 
---------- //List3: nothing 
---------- //List4: nothing 

正如你看到的,所產生的所有數字都沒有在那裏。 但如果我刪除'nums.Clear();'在「button2_Click」事件,我得到這個:

Number of lists entered: 4 //OK 
---------- //List1 
0 
5 
9 
1 
----------//List2 
0 
5 
9 
1 
----------//List3 
0 
5 
9 
1 
----------//List4 
0 
5 
9 
1 
//All wrong 

它存儲所有的值,但在一個錯誤的方式,因爲我想要實現的是:

Number of lists entered: 4 
----------//List1 
0 
----------//List2 
5 
----------//List3 
9 
----------//List4 
1 

難道我錯了嗎?我還需要做點別的嗎?請幫忙,謝謝你的閱讀。

+8

'List'是一個引用類型(類似於其他語言的指針)。您需要再次使用「新List」而不是「Clear」,以便它成爲* new *列表。 – crashmstr 2014-10-10 17:09:02

+0

'Allnums'只保留對其他列表的引用,所以當你清除()'它們時,數據將被刪除。對Allnums中每個'nums'列表的引用保持不變。如何解決這種問題取決於你想要做什麼。這裏的最終目標是什麼? – 2014-10-10 17:20:11

回答

1

編輯:正如@crashmstr所說,List是一個引用類型。更好的解決方案是:

AllNums.Add(nums); 
nums = new List<List<int>>(); 

===================================== ==================

在你的button2_Click函數中,你需要創建一個nums的副本,然後將它添加到Allnums中。這樣的事情會做的伎倆:

var newNums = nums.ToArray().ToList(); 
Allnums.Add(newNums); 
+0

這件事讓我整天忙着,謝謝! – 2014-10-10 17:26:21

1

你做Allnums.Add(nums);之後,你有你的nums兩個引用:一個內部Allnums,和一個你nums內。當您將nums四次添加到Allnums時,您有5個參考指向相同的列表!

您必須創建新的名單,我建議這個解決方案之一:

Allnums.Add(new List<int>(nums))

Allnums.Add(nums); 
nums = new List<int>(); 

button2_Click方法。