Problème avec List.Add () uniquement en enregistrant le dernier élément ajouté

Le problème que je remarque est cette ligne de code:

tempList.Add(orderables); 

Dans ce code complet:

 AssociatedComboItems ai = new AssociatedComboItems(); List tempList = new List(); Orderables orderables = new Orderables(); foreach (var t in comboBox1.Items) { ai.ComboBoxItem = t.ToSsortingng(); 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(); AssociatedItems.Add(ai); } 

Lorsque je mets mon point d’arrêt sur la ligne mentionnée ci-dessus ( tempList.Add(orderables); ( tempList.Add(orderables); ), la première fois qu’il ajoute l’élément correctement au templist , il y aura un élément. La deuxième fois, il appenda le bon élément à la liste, mais si je survole la liste tempList et que tempList veux voir son contenu, bien qu’il ait deux éléments, les deux sont identiques, c’est maintenant le deuxième élément ajouté à liste. Il a écrasé le premier.

Je ne peux pas comprendre ce qui ne va pas avec cela et pourquoi cela se produit.

Vous devez instancier les éléments Orderables dans la boucle for; sinon, vous continuez à réutiliser la même instance dans toutes les itérations (et à écraser ses propriétés à chaque fois).

 AssociatedComboItems ai = new AssociatedComboItems(); List tempList = new List(); foreach (var t in comboBox1.Items) { ai.ComboBoxItem = t.ToSsortingng(); 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(); AssociatedItems.Add(ai); } 

Non lié à la question: Vous pouvez trouver la syntaxe d’ initialisation d’object plus propre:

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

Le problème est que vous ne possédez qu’une seule instance de points à commander et que vous continuez à modifier la même instance et à l’append de nouveau à la liste. Chaque référence dans la liste pointe vers le même object. Déplacez la déclaration orderables à l’intérieur de la boucle for interne et cela résoudra le problème.