【发布时间】:2017-03-01 14:14:38
【问题描述】:
目前,要替换我正在使用以下代码的项目:
var oldItem = myList.Single(x => x.Id == newItem.Id);
var pos = myList.ToList().IndexOf(oldItem);
myList.Remove(oldItem);
myList.ToList().Insert(pos, newItem);
所以,我创建了一个扩展来执行与上面相同的操作,但使用 lambda 表达式,我想出了这个:
public static ICollection<T> Replace<T>(this IEnumerable<T> list, T oldValue, T newValue) where T : class
{
if (list == null)
throw new ArgumentNullException(nameof(list));
return list.Select(x => list.ToList().IndexOf(oldValue) != -1 ? newValue : x).ToList();
}
所以我可以这样使用它:
var oldItem = myList.Single(x => x.Id == newItem.Id);
myList = myList.Replace(oldItem, newItem);
但是,它不起作用。我错过了什么?
【问题讨论】:
-
IEnumerable并不是真正为替换事物而设计的,并且从设计上讲,它不能确定您是否可以/应该多次迭代它们。 -
我假设
Id是唯一的,考虑一个Dictionary,其中键是Id,值是item。 -
@EdPlunkett 我认为这属于“它不起作用”。
-
@EdPlunkett 那么我想我们应该提出一个规范的问题,以便我们可以关闭与该问题重复的问题。
-
您真的需要它来处理
IEnumerable不会IList吗?