InvalidOperationException 在 foreach 循环中使用 String.compare 时
本文关键字:String compare foreach 循环 InvalidOperationException | 更新日期: 2023-09-27 18:31:36
我只是想将字符串列表与某个值进行比较。这是我的代码:
foreach (string s in myList)
{
int comp = String.Compare(s, line_to_delete);
if (comp == 0)
{
myList.Remove(s);
}
}
问题是,每当我使用"comp == 1"时,我都不会得到任何异常,但我希望它检查字符串是否相同。
使用 foreach
迭代循环时,您无法修改集合,因为它会弄乱迭代器。 要么使用 for
循环,要么保留要删除的字符串列表,并在foreach
循环结束后删除它们。
您收到异常,因为您正在尝试修改集合
myList.Remove(s);
不能修改循环中迭代的列表foreach
。查看每个 - MSDN
foreach 语句为每个语句重复一组嵌入式语句 元素或实现 System.Collections.IEnumerable or System.Collections.Generic.IEnumerable(Of T) 接口。福里奇 语句用于循环访问集合以获取 需要但不能用于添加或删除项目的信息 从源集合中避免不可预测的副作用。如果 您需要在源集合中添加或删除项,请使用 圈。
对于您的问题:
问题是,每当我使用"comp == 1"时,我都不会得到任何例外
因为这样它就没有通过检查,列表保持不变。
我不知道你为什么要用string.Compare
,因为你似乎在检查平等。
您可以简单地执行以下操作:
myList = myList.Where(r=> r != line_to_delete).ToList();
如果您尝试使用 string.Compare
以便可以执行不区分大小写的比较,请查找字符串。等于重载,它也需要StringComparison
枚举进行不区分大小写的比较。
myList = myList
.Where(r => r.Equals(line_to_delete, StringComparison.InvariantCultureIgnoreCase))
.ToList();
改用for
循环:
for (Int32 i = myList.Count - 1; i >= 0 i--)
{
String s = myList[i];
if (s.Equals(lineToDelete))
myList.RemoveAt(i);
}
循环访问集合时无法更改集合。 反向循环可确保在删除内容时不会使索引无效(以防删除多个匹配条目)。
另一种选择:
myList.RemoveAll(str => str.Equals(lineToDelete));
如前所述,您会收到异常,因为您尝试在迭代期间修改集合。
你最好这样做:
//Remove single instance
var s = myList.FirstOrDefault(x => x.Equals(line_to_delete));
if (s != null)
myList.Remove(s);
或
//Remove all instances
myList = myList.Where(x => !x.Equals(line_to_delete)).ToList();
不能修改要枚举的集合的元素以保护枚举的完整性。
您可以改用 for 循环。请确保在删除元素时更新索引,否则将对错误的元素进行操作,最终出现索引越界异常。
for (int i = 0; i < myList.Length; i++)
{
int comp = string.Compare(myList[i], line_to_delete);
if (comp == 0)
{
myList.Remove(i);
i--;
}
}