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
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");
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);
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 );