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

时间:2013-09-17 19:15:59

标签: c# .net windows-phone-7 windows-phone-8 windows-phone

我只是想将字符串列表与某个值进行比较。 这是我的代码:

foreach (string s in myList)
            {
                int comp = String.Compare(s, line_to_delete);
                if (comp == 0)
                {
                    myList.Remove(s);
                }
            }

问题是每当我使用'comp == 1'时我都没有例外,但是我希望它检查字符串是否相同..

5 个答案:

答案 0 :(得分:2)

您正在尝试修改集合

myList.Remove(s);

您无法修改在foreach循环中迭代的列表。 见foreach - MSDN

  

foreach语句为每个语句重复一组嵌入式语句   数组中的元素或实现的数组   System.Collections.IEnumerable或   System.Collections.Generic.IEnumerable(Of T)接口。 foreach   statement用于迭代集合以获取   您想要的信息,但不能用于添加或删除项目   从源集合中避免不可预测的副作用。 如果   您需要在源集合中添加或删除项目,使用for   循环。

对于你的问题:

  

问题是每当我使用'comp == 1'时我都没有异常

因为它没有通过检查,列表保持不变。

我不知道您使用string.Compare的原因,因为您似乎正在检查是否相等。

您可以这样做:

myList = myList.Where(r=> r != line_to_delete).ToList();

如果您尝试使用string.Compare以便可以执行不区分大小写的比较,那么请查找string.Equals重载,其中StringComparison枚举也会进行不区分大小写的比较。

myList = myList
            .Where(r => r.Equals(line_to_delete, StringComparison.InvariantCultureIgnoreCase))
            .ToList();

答案 1 :(得分:2)

当使用foreach迭代循环时,您无法修改集合,因为它会弄乱迭代器。使用for循环或保留要删除的字符串列表,并在foreach循环结束后删除它们。

答案 2 :(得分:2)

改为使用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));

答案 3 :(得分:0)

如上所述,您将获得异常,因为您在迭代期间尝试修改集合。

你最好这样做:

//Remove single instance
var s = myList.FirstOrDefault(x => x.Equals(line_to_delete));
if (s != null)
    myList.Remove(s);

OR

//Remove all instances 
myList = myList.Where(x => !x.Equals(line_to_delete)).ToList();

答案 4 :(得分:0)

您无法修改要枚举的集合的元素,以保护枚举的完整性。

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