2014-11-05 8 views
11

In C#, wenn ich eine List<T>, und ich habe ein Objekt vom Typ T, wie kann ich einen bestimmten Artikel in der List<T> mit dem Objekt vom Typ T ersetzen? HierErsetzen Sie ein Objekt in einer Liste von Objekten

ist, was ich versucht habe:

List<CustomListItem> customListItems = new List<CustomListItem>(); 
CustomListItem customListItem1 = new CustomListItem() { name = "Item 1", date = DateTime.MinValue}; 
CustomListItem customListItem2 = new CustomListItem() { name = "Item 2", date = DateTime.MinValue }; 
CustomListItem customListItem3 = new CustomListItem() { name = "Item 3", date = DateTime.MinValue }; 

customListItems.Add(customListItem1); 
customListItems.Add(customListItem2); 
customListItems.Add(customListItem3); 

CustomListItem newCustomListItem = new CustomListItem() { name = "Item 4", date = DateTime.Now }; 

customListItem2 = customListItems.Where(i=> i.name == "Item 2").First(); 
customListItem2 = newCustomListItem; 

In dem obigen Code, ich möchte den customListItem2 mit dem newCustomListItem ersetzen.

Muss ich den Artikel in der Liste entfernen und dann den neuen Artikel einfügen? Kann ich keine einfache Zuweisung von customListItem2 = newCustomListItem machen?

Wie kann ein Artikel in einer Liste am effizientesten durch einen anderen Artikel ersetzt werden?

Vielen Dank im Voraus

+0

Haben Sie http geprüft: // Stackoverflow. com/questions/17188966/how-to-replace-Liste-Artikel-in-Best-Weg? – haim770

+0

Zusätzlich zu den Lösungen, die bereits veröffentlicht wurden, sollten Sie auch einen Equals/GetHashCode für Ihren benutzerdefinierten Typ implementieren, andernfalls kann Ihre Where/Index-Operation möglicherweise nicht das richtige Element finden. – HimBromBeere

Antwort

24

Sie haben das Produkt zu ersetzen, nicht den Wert von customListItem2. Folgende Ersetzen Sie einfach:

customListItem2 = customListItems.Where(i=> i.name == "Item 2").First(); 
customListItem2 = newCustomListItem; 

mit diesem:

customListItem2 = customListItems.Where(i=> i.name == "Item 2").First(); 
var index = customListItems.IndexOf(customListItem2); 

if(index != -1) 
    customListItems[index] = newCustomListItem; 

Edit:

Wie Roman R. in einem Kommentar erwähnt, können Sie die .Where(predicate).First() durch einen einfachen First(predicate) ersetzen:

customListItem2 = customListItems.First(i=> i.name == "Item 2"); 
+0

Danke. Schön und einfach. – user3736648

+1

Sie können die .Where durch .First an erster Stelle ersetzen und sie vom Ende löschen. Es wird das gleiche Ergebnis, aber mit sauberer und schneller Code. Gefällt es Ihnen wie folgt: customListItem2 = customListItems.First (i => i.name == "Item 2"); –

+0

@RomanR. Danke für den Tipp, redigierte meine Antwort. :) – Abbas

7
var customListItems = new List<CustomListItem>(); 
var customListItem1 = new CustomListItem() { name = "Item 1", date = DateTime.MinValue }; 
var customListItem2 = new CustomListItem() { name = "Item 2", date = DateTime.MinValue }; 
var customListItem3 = new CustomListItem() { name = "Item 3", date = DateTime.MinValue }; 

customListItems.Add(customListItem1); 
customListItems.Add(customListItem2); 
customListItems.Add(customListItem3); 

var newCustomListItem = new CustomListItem() { name = "Item 4", date = DateTime.Now }; 

customListItems[customListItems.FindIndex(x => x.name == "Item 2")] = newCustomListItem; 

oder

public static class ListExtensions 
{ 
    public static void Replace<T>(this List<T> list, Predicate<T> oldItemSelector , T newItem) 
    { 
     //check for different situations here and throw exception 
     //if list contains multiple items that match the predicate 
     //or check for nullability of list and etc ... 
     var oldItemIndex = list.FindIndex(oldItemSelector); 
     list[oldItemIndex] = newItem; 
    } 
} 

und dann

customListItems.Replace(x => x.name == "Item 2", newCustomListItem); 
+0

Verwendet die Erweiterung Ansatz Reflexion? Es ist sicherlich bequemer mit diesem Code, und ich ging diesen Weg. Ich wundere mich nur über einen Leistungseinbruch. – dunwan

+0

Nein, es verwendet keine Reflektion. @dunwan – dotctor

+0

Bei dieser Lösung wird die Liste nur einmal durchlaufen. Mit dem einen in der angenommenen Antwort zweimal. Aber oft oder normalerweise sollte der nicht gefundene Fall behandelt werden. Wenn das Element nicht gefunden wird, gibt FindIndex -1 zurück. – noox

1

wenn Reihenfolge der Liste nicht dann für Sie Sie diese versuchen können

CustomListItem newCustomListItem = new CustomListItem() { name = "Item 4", date = DateTime.Now }; 

customListItem2 = customListItems.Where(i=> i.name == "Item 2").First(); 

customListItems.Remove(customListItem2); 
customListItems.Add(newCustomListItem); 
Verwandte Themen