我只是想将字符串列表与某个值进行比较。 这是我的代码:
foreach (string s in myList)
{
int comp = String.Compare(s, line_to_delete);
if (comp == 0)
{
myList.Remove(s);
}
}
问题是每当我使用'comp == 1'时我都没有例外,但是我希望它检查字符串是否相同..
答案 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--;
}
}