【发布时间】: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
【问题讨论】:
-
如果你只想要
*.cs,你可以把它传递给GetFiles。 -
或者你可以用一个快速的 LINQ 表达式替换你的 for 循环,比如
return files.Where(t=>Path.GetExtension(t) == ".cs").ToArray(); -
XY 问题。 @Blorgbeard 明白了这一点。