2016-01-15 1 views
1
 List<int[]> LST = new List<int[]>();   
     int[] ARY = new int[2];      
     Random RND = new Random(); 
     for(int i = 0 ; i < 2 ; i++) 
     { 
      ARY[0] = RND.Next(100, 999);  
      ARY[1] = RND.Next(100, 999);  
      LST.Add(ARY);       
      MessageBox.Show( 
      LST.Count.ToString() + "\n" + 
      LST[i][0].ToString() + ", " + 
      LST[i][1].ToString()); 
     } 
     foreach (var x in LST) 
      MessageBox.Show( 
      x[0].ToString() + " ," + 
      x[1].ToString()); 

Привет .. эксперты !!Я сделал список массивов, он не работает хорошо

Хотел бы иметь;

Foo, Boo 
Poo, Voo 

Но я получил;

Poo, Voo 
Poo, Voo 

В средней точке проверки, оба они выглядят хорошо. Но, на заключительном этапе, я получил сплющенный список (последний повторяется). Любые разъяснения по ходу? Привет (Да, я обнаружил, что если я переместил декларацию ARY внутри для цикла, то результат будет в порядке, хотя. Я хотел бы иметь причину, почему ..)

ответ

4

Вы создаете массив один раз, а затем вы меняете его содержимое и добавляете его в список несколько раз.

Обратите внимание: что List может иметь два элемента, которые указывают на один и тот же объект. И это то, что происходит в вашем случае. Список LST имеет два элемента, которые указывают на один и тот же массив.

Вы можете это исправить, перемещая эту линию внутри цикла:

int[] ARY = new int[2]; 

В чеке средней точки, окно сообщения покажет текущие значения массива, который является то, что вы только что установили.

Чтобы это было ясно, проверьте значение LST[0] на второй итерации цикла перед вызовом MessageBox.Show.... Он покажет новые значения, а не старые.

Или еще лучше, на второй итерации проверьте значение LST[0] после выполнения ARY[0] = RND.Next(100, 999);, но перед выполнением ARY[1] = RND.Next(100, 999);.

+0

Спасибо. Но, как насчет проверки промежуточной точки, она показывает правильные значения LST (они различают их оба). С уважением – Jason

+0

@ Джейсон, см. Мое обновление –

+0

Большое спасибо. Наверное, мне нужно время, чтобы снова подумать (на самом деле, я потратил пару часов), С уважением – Jason

1

Считает, что вы никогда не повторно инициализировать массив и, таким образом, перезаписывать те же два места в памяти снова и снова. Отслеживайте программу, и вы должны это легко увидеть.

+0

Спасибо, ответ. Но, как насчет проверки промежуточной точки, она показывает правильный процесс. С уважением – Jason

+0

Был ли «ARY» заполнен дважды к тому времени или только один раз? Помните, что в первый раз нет ничего особенного, когда 2-й, 3-й, 4-й и т. Д. Будут там, где вы будете переписывать, что вы не видите. –

+0

В средней точке проверьте, что ARY (да, у меня есть только один ARY) заполнен «другой» парой значений. Итак, LST показывает правильные «разные» пары. Теперь, внезапно, на последнем этапе LST уплощен. С уважением – Jason