2012-05-17 2 views
1

в строке кода дляПроблема с List.Add(): он сохраняет только последний добавленный элемент

tempList.Add(orderables); 

в этом полный код:

AssociatedComboItems ai = new AssociatedComboItems(); 
    List<Orderables> tempList = new List<Orderables>(); 
    Orderables orderables = new Orderables(); 

    foreach (var t in comboBox1.Items) 
    { 
     ai.ComboBoxItem = t.ToString(); 

     for (int i = 0; i < fpSpread1.ActiveSheet.RowCount; i++) 
     { 
      orderables.Display = fpSpread1.ActiveSheet.Cells[i, 1].Text; 
      orderables.ShowInDSR = (bool)fpSpread1.ActiveSheet.Cells[i, 0].Value; 
      orderables.DisplayOrder = i; 
      tempList.Add(orderables); 
     } 

     ai.AssociatedItems = tempList; 
     tempList.Clear(); 
     if(AssociatedItems == null) 
     AssociatedItems = new List<AssociatedComboItems>(); 
     AssociatedItems.Add(ai); 
    } 

, когда я положил контрольную точку на линии (tempList.Add (заказываемые данные);) при первом добавлении элемента к templist, и в нем будет один элемент. Во второй раз это будет правильный элемент в списке, но если я навешиваю tempList и хочу увидеть его содержимое, хотя он имеет два элемента, но оба они одинаковы, и оба они теперь являются вторым элементом, который добавляется к список, поэтому он перезаписал первый, ...

Я не могу понять, что с этим происходит, и почему это происходит.

Спасибо всем.

+1

tempList.Clear(); опустошает список –

ответ

7

Вам необходимо создать экземпляр Orderablesв пределах петля for; в противном случае вы продолжаете использовать один и тот же экземпляр во всех итерациях (и каждый раз переписывая его свойства).

AssociatedComboItems ai = new AssociatedComboItems(); 
List<Orderables> tempList = new List<Orderables>(); 

foreach (var t in comboBox1.Items) 
{ 
    ai.ComboBoxItem = t.ToString(); 

    for (int i = 0; i < fpSpread1.ActiveSheet.RowCount; i++) 
    { 
     Orderables orderables = new Orderables(); // ← Instantiate here 
     orderables.Display = fpSpread1.ActiveSheet.Cells[i, 1].Text; 
     orderables.ShowInDSR = (bool)fpSpread1.ActiveSheet.Cells[i, 0].Value; 
     orderables.DisplayOrder = i; 
     tempList.Add(orderables); 
    } 

    ai.AssociatedItems = tempList; 
    tempList.Clear(); 
    if(AssociatedItems == null) 
    AssociatedItems = new List<AssociatedComboItems>(); 
    AssociatedItems.Add(ai); 
} 

Unrelated на вопрос: Вы могли бы найти object initializer синтаксис быть чище:

 Orderables orderables = new Orderables 
     { 
      Display = fpSpread1.ActiveSheet.Cells[i, 1].Text, 
      ShowInDSR = (bool)fpSpread1.ActiveSheet.Cells[i, 0].Value, 
      DisplayOrder = i, 
     }; 
+0

Спасибо. Это исправило это. В моих учебных целях: я думал, что одного объекта достаточно, потому что каждый раз, когда я назначаю ему новые значения и передавая его в список ... так это потому, что это ссылочный тип? и в этом причина? – Bohn

+1

Точно. Типы ссылок (классы) отличаются от типов значений (structs), потому что последние копируются при назначении (например, когда они передаются в метод «List .Add'), в то время как у первых только их _reference_ (pointer) копируется, но все равно будет указывать на тот же объект (экземпляр). Таким образом, изменения в состоянии объекта через любую из переменных, ссылающихся на него, будут тогда «появляться» и на всех других переменных. – Douglas

+1

Большое вам спасибо. – Bohn

1

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

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