集合已修改;枚举操作可能无法执行

本文关键字:执行 操作 修改 枚举 集合 | 更新日期: 2023-09-27 18:03:48

可能重复:
集合已修改;枚举操作可能无法执行-为什么?

首先,我相信这不是一个重复的问题,因为这里的上下文涉及Extension方法。

当通过Extension方法将项目从一个列表移动到另一个列表时,我会遇到这个异常,我有点困惑,因为我要从中删除项目的列表不是我要迭代的列表。

例如,扩展方法至少看起来是这样的:

public static void MoveItemsTo(this IList source, IList target, IList items)
{
    foreach (var item in items) {
        target.Add(item);
        source.Remove(item);
    }
}

这就是方法的调用方式:

myCollectionOne.MoveItemsTo(myCollectionTwo, itemsToMove);

只有当我尝试从源列表中删除项目时,我才会收到错误。。。这有点令人困惑,因为该方法正在对不同的列表进行迭代。幕后一定发生了一些我不知道的事情。。。

集合已修改;枚举操作可能无法执行

不要使用foreach循环,而是使用正则的for循环。您实际上是在从项目列表中删除一个项目,因为这就是您要迭代的内容。

for (int i = 0; i < items.Count; i++)
{
    target.Add(item);
    source.Remove(source[i]);
}

顺便说一句,如果这确实是您想要实现的,那么您可能只需要在for循环之后一次性清除整个源列表。

这将返回一个新列表,该列表是项目从源移动到目标的结果,而不会更改源列表。这通过将源列表视为不可变列表来避免问题中的引用问题。

void Main()
{
    var a = new List<string>() { "a","b","c" };
    var b = new List<string>() { "d" };
    var c = a.MoveItemsTo(i=>i=="b",b);
    c.Dump(); // { "d", "b" }
}
public static class Extensions
{
    public static IEnumerable<T> MoveItemsTo<T>(this IEnumerable<T> source, Func<T,bool> Predicate,IEnumerable<T> DestSource)
    {
        var newList = new List<T>(DestSource);
        newList.AddRange(source.Where(Predicate).ToList());
        return newList;
    }
}