web-dev-qa-db-fra.com

Remplacer un objet dans une liste d'objets

En C #, si j'ai un List<T>, et j'ai un objet de type T, comment puis-je remplacer un élément spécifique dans le List<T> avec l'objet de type T?

Voici ce que j'ai essayé:

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;

Dans le code ci-dessus, je veux remplacer le customListItem2 avec le newCustomListItem.

Dois-je supprimer l'élément dans la liste, puis insérer le nouvel élément? Puis-je ne pas faire une simple affectation de customListItem2 = newCustomListItem?

Quelle est la manière la plus efficace de remplacer un élément d'une liste par un autre élément?

Merci d'avance

25
user3736648

Vous devez remplacer l'article, pas la valeur de customListItem2. Remplacez simplement ce qui suit:

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

Avec ça:

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

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

Modifier:

Comme Roman R. indiqué dans un commentaire, vous pouvez remplacer la .Where(predicate).First() par une simple First(predicate):

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;

ou

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;
    }
}

et alors

customListItems.Replace(x => x.name == "Item 2", newCustomListItem);
8
Hamid Pourjam

si la séquence de la liste ne vous importe pas, vous pouvez essayer ceci

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