替换对象列表中的对象
在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 );