0

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

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

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

4

5 回答 5

2

您收到异常是因为您正在尝试修改集合

myList.Remove(s);

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

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

对于您的问题:

问题是,每当我使用 'comp == 1' 时,我都没有例外

因为那样它没有通过检查并且列表保持不变。

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

你可以简单地做:

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

如果您尝试使用string.Compare以便可以执行不区分大小写的比较,请查找string.Equals重载,它也将StringComparisonenum 用于不区分大小写的比较。

myList = myList
            .Where(r => r.Equals(line_to_delete, StringComparison.InvariantCultureIgnoreCase))
            .ToList();
于 2013-09-17T19:17:24.427 回答
2

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

于 2013-09-17T19:18:00.870 回答
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));
于 2013-09-17T19:19:29.697 回答
0

如前所述,您收到异常是因为您试图在迭代期间修改集合。

你最好这样做:

//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();
于 2013-09-17T19:23:33.483 回答
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--;
    }
}
于 2013-09-17T19:23:53.490 回答