替换对象列表中的对象

在C#中,如果我有一个List ,并且我有一个T类型的对象,我如何用类型T的对象替换List的特定项?

这是我尝试过的:

 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进行简单的分配吗?

用另一个项目替换列表中项目的最有效方法是什么?

提前致谢

您必须替换item,而不是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; 

编辑:

正如Roman R.在评论中所述,你可以用简单的First(predicate)替换.Where(predicate).First() 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 );