【问题标题】:C# list.remove throwing enumeration operation error in foreach loopC# list.remove 在 foreach 循环中抛出枚举操作错误
【发布时间】:2019-04-29 16:21:56
【问题描述】:

我查看了多个与我相关的 SO 问题以及谷歌搜索,但我一直无法找到适合我的解决方案。

给定一个文件列表,出于某种原因,我试图剔除所有非 cs 文件。我获取字符串数组,转换为列表,然后遍历列表,使用 list.Remove() 删除所有我不想要的文件。

第一次删除后,它会出错

Collection was modified; enumeration operation might not execute

代码是:

string[] files = null;
            try
            {
                files = System.IO.Directory.GetFiles(currentDir);

                //Converting to list, to use list.Remove rather than rewriting entire array at each delete
                var list = new List<string>(files);
                foreach (string readFile in list)
                {
                    if (Path.GetExtension(readFile) != ".cs") //|| Path.GetExtension(readFile) != ".dll")
                    {
                        //remove, as we don't currently care about non cs files.
                        list.Remove(readFile);
                    }
                }

                //Converting back to string array for use in the rest of the program
                files = list.ToArray();
            }

我也尝试过 RemoteAt(),它会产生同样的错误。

string[] files = null;
            try
            {
                files = System.IO.Directory.GetFiles(currentDir);

                //Converting to list, to use list.Remove rather than rewriting entire array at each delete
                var list = new List<string>(files);
                int i = 0;
                for(int i=0; i<list.Count();i++)
                {
                    if (Path.GetExtension(readFile) != ".cs") //|| Path.GetExtension(readFile) != ".dll")
                    {
                        //remove, as we don't currently care about non cs files.
                        list.RemoveAt(i);
                    }
                    i++;
                }

                //Converting back to string array for use in the rest of the program
                files = list.ToArray();
            }

任何克服此错误的建议,因为某些目录中将包含超过 500 个文件,我希望尽可能避免重写字符串数组。

我已阅读以下 SO 问题:

How to remove item from list in C#?

C# error Collection was modified; enumeration operation might not execute

Enumerations Foreach Loop C#

"List.Remove" in C# does not remove item?

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.remove?view=netframework-4.8

https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.removeat?view=netframework-4.8

【问题讨论】:

  • 如果你只想要*.cs,你可以把它传递给GetFiles
  • 或者你可以用一个快速的 LINQ 表达式替换你的 for 循环,比如return files.Where(t=&gt;Path.GetExtension(t) == ".cs").ToArray();
  • XY 问题。 @Blorgbeard 明白了这一点。

标签: c# list foreach


【解决方案1】:

如果我改变了

foreach (string readFile in list)

foreach (string readFile in list.ToList())

它有效。

我的猜测是 list.Remove 改变了原始列表,并使枚举无效。

【讨论】:

  • "我的猜测是 list.Remove 改变了原始列表,并使枚举无效。" -- 这是正确的
【解决方案2】:

您可以在List 上使用RemoveAll 方法:

list.RemoveAll(readFile => Path.GetExtension(readFile) != ".cs");

这将删除与谓词匹配的所有内容,并返回它删除的项目数。

【讨论】:

    【解决方案3】:

    您也可以按相反的顺序使用 for 循环,以便删除的条目不会影响循环。

    for (int x = list.Count-1; x >= 0; x--)
    {
      string readFile = list[x];
      // ...
      list.Remove(readFile);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-19
      • 2013-12-18
      • 2014-06-06
      • 1970-01-01
      • 2011-03-24
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多