2012-04-01 3 views
1

У меня есть простая структура класса, которая имеет массивную часть своих полей. Я хочу сохранить этот класс в списке. Проблема заключается в добавлении дополнительных структур классов в список, который он обрабатывает, как если бы это было прямое обновление и не ссылалось.populating List <> using Array get wrong numbers

public class TrayLayout 
{ 
     public int[] inerD { get; set; } 

public class TrayLayout 
{ 
     public int[] inerD { get; set; } 

     public TrayLayout(int[] inerD) 
     { 
      this.inerD = inerD; 
     } 
} 
public partial class Form1 : Form 
{ 
     public List<TrayLayout> trayL = new List<TrayLayout>(); 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      int[] aa = new int[2]; 
      aa[0]=1; 
      aa[1]=2; 
      //add the new class to TrayLoayout 
      trayL.Add(new TrayLayout(aa)); 
      aa[0]=3; 
      aa[1]=4; 
      //add the new class to TrayLoayout using input array 
      trayL.Add(new TrayLayout(aa)); 
      aa[0]=5; 
      aa[1]=6; 
      //add the new class to TrayLoayout 
      trayL.Add(new TrayLayout(aa)); 
      textBox1.Text = "the numbers accepted \n"+ trayL[0].inerD[0].ToString() + " , " +trayL[0].inerD[1].ToString() + " \n" + trayL[1].inerD[0].ToString() + " , " +trayL[1].inerD[1].ToString() + " \n" + trayL[2].inerD[0].ToString() + " , " +trayL[2].inerD[1].ToString() ; 

     } 

я получаю в TextBoxes это показывает последний вход 5,6 5,6 5,6 вместо 1,2 3,4 5,6. Мне что-то не хватает?

ответ

2

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

+0

Я знаю это, но как это сделать, мой код неправильный? – user1306240

0

Вы создали 1 ArrayObject aa. И вы переписываете первые 2 значения, когда назначаете 3 и 4. И когда вы назначаете 5 и 6, вы перезаписали 3 и 4.

Создайте 3 разных массива или сделайте aa [0] aa [5].

0

Вы должны заменить это:

int[] aa = new int[2]; 
aa[0]=1; 
aa[1]=2; 
//add the new class to TrayLoayout 
trayL.Add(new TrayLayout(aa)); 
aa[0]=3; 
aa[1]=4; 
//add the new class to TrayLoayout 
trayL.Add(new TrayLayout(aa)); 
aa[0]=5; 
aa[1]=6; 
//add the new class to TrayLoayout 
trayL.Add(new TrayLayout(aa)); 

С этим:

trayL.Add(new TrayLayout(new int[]{1,2})); 
trayL.Add(new TrayLayout(new int[]{3,4})); 
trayL.Add(new TrayLayout(new int[]{5,6})); 

Редактировать

Вы можете сделать это следующим образом:

var start=1; 
var end=13; 
trayL.Add(new TrayLayout(Enumerable.Range(start,end).ToArray())); 
+0

Что делать, если у меня есть массив 0f 53, который будет чертовски кодировать, есть простой способ – user1306240

+0

Я не совсем уверен, что вы имеете в виду. Можете ли вы показать код? – Arion

+0

trayL.Add (новый TrayLayout (новый int [] {1,2,3,4,5,6,7,8,9,10,11,12,13})); и т. д. ... not convenint – user1306240

0

Назначение массива int классу TrayLayout не делает копию. Каждый экземпляр класса TrayLayout имеет в своем примере тот же массив, поэтому при его обновлении после вызова конструктора TrayLayout все ваши экземпляры TrayLayout видят одинаковые значения.

Либо скопируйте массив внутри конструктора TrayLayout, либо (как другие предлагают) используют разные массивы в вызовах конструктора.

+0

Я попытался в объявлении constractor TrayLayout (int [] ainerD) { this.inerD [0] = ainerD [0]; this.inerD [1] = ainerD [1]; } и ничего не было writin – user1306240

+0

Вы по-прежнему только фиксируете ссылку. Используйте что-то вроде 'this.inerD = new int [ainerD.Length]; Array.Copy (ainerD, this.inerD, ainerD.Length); ' – nickd

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