2014-10-10 2 views
0

Это мой первый опыт работы с коллекциями, и я застрял здесь, я сделал тестовый проект, чтобы проверить его, и я столкнулся с проблемой, я не знаю, как работать.Списки внутри списка в C#

Во-первых, то, что я хочу сделать, в частности, со списками (не могу использовать что-нибудь еще), чтобы иметь большое список с целыми списками внутри, как это:

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

Числа я хочу добавить предыдущий список собраны здесь:

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

Пока что так хорошо.

мне нужно добавить на неопределенное время раз списки (Nums) в мой основной список (Allnums), так что я не могу создать nums1, nums2, num3 ... и т.д.

Ok, позволяет попробовать добавить случайное число Nums: (только 1 номер на данный момент)

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

Теперь, позволяет сохранить номер, который был сгенерирован и ясно перечислить НУМС сохранить новый новый номер в следующий раз (Давайте магазин 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' - ссылочный тип (аналогично указателям на других языках). Вам нужно снова «новый список» вместо «Очистить», чтобы он был * новым * списком. – crashmstr

+0

'Allnums' поддерживает только ссылки на ваши другие списки, поэтому, когда вы' .Clear() 'them, данные будут удалены. Сохранение ссылок на каждый из списков 'nums' в' Allnums' вообще не меняется. Как точно исправить это зависит от того, что вы пытаетесь сделать. Какова конечная цель здесь? –

ответ

1

Редактировать: Как указано в @crashmstr, List является ссылочным типом. Лучшим решением было бы:

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

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

В вашей функции button2_Click вам необходимо создать копию nums, прежде чем добавлять ее в Allnums. Нечто подобное будет делать трюк:

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

Эта вещь заставляла меня заняться весь день вчера, спасибо! –

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.

Смежные вопросы