wake-up-neo.net

Ersetzen Sie ein Objekt in einer Liste von Objekten

Wie kann ich in C #, wenn ich einen List<T> Und ein Objekt vom Typ T habe, ein bestimmtes Element im List<T> Durch ein Objekt vom Typ T ersetzen?

Folgendes habe ich versucht:

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;

Im obigen Code möchte ich den customListItem2 Durch den newCustomListItem ersetzen.

Muss ich das Element aus der Liste entfernen und dann das neue Element einfügen? Kann ich nicht einfach customListItem2 = newCustomListItem Zuweisen?

Was ist die effizienteste Methode, um ein Element in einer Liste durch ein anderes Element zu ersetzen?

Danke im Voraus

25
user3736648

Sie müssen den Artikel ersetzen, nicht den Wert von customListItem2. Ersetzen Sie einfach folgende:

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;

Bearbeiten:

Wie Roman R. in einem Kommentar feststellte, können Sie .Where(predicate).First() durch ein einfaches First(predicate) ersetzen:

customListItem2 = customListItems.First(i=> i.name == "Item 2");
41
Abbas
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);
8
Hamid Pourjam

wenn die Reihenfolge der Listen für Sie keine Rolle spielt, können Sie dies versuchen

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 );
2
user4093832