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"时,我都不会得到任何异常,但我希望它检查字符串是否相同。

InvalidOperationException 在 foreach 循环中使用 String.compare 时

使用 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--;
    }
}