Заменить объект в списке объектов

В C #, если у меня есть List , и у меня есть объект типа T , как я могу заменить определенный элемент в List на объект типа T ?

Вот что я пробовал:

 List customListItems = new List(); 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; 

В приведенном выше коде я хочу заменить customListItem2 на newCustomListItem .

Должен ли я удалить элемент в списке, а затем вставить новый элемент? Могу ли я сделать простое назначение customListItem2 = newCustomListItem ?

Каков наиболее эффективный способ замены элемента в списке другим элементом?

заранее спасибо

    Вы должны заменить элемент, а не значение customListItem2 . Просто замените следующее:

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

    С этим:

     customListItem2 = customListItems.Where(i=> i.name == "Item 2").First(); var index = customListItems.IndexOf(customListItem2); if(index != -1) customListItems[index] = newCustomListItem; 

    Редактировать:

    Как отметил Роман Р. в комментарии, вы можете заменить .Where(predicate).First() First(predicate) простым First(predicate) :

     customListItem2 = customListItems.First(i=> i.name == "Item 2"); 
     var customListItems = new List(); 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; 

    или же

     public static class ListExtensions { public static void Replace(this List list, Predicate 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; } } 

    а потом

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

    если последовательность списка не имеет значения для вас, вы можете попробовать это

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