我有一段用C#编写的代码:
foreach (var item in allNegatives)
{
for (int index = 0; index < _items.Count(); index++)
{
if (_items[index].Title.ToLower().IndexOf(item, StringComparison.OrdinalIgnoreCase) >= 0)
{
_items.RemoveAt(index);
}
}
}
_items
集合是一个字符串列表(长标题)...现在你可以看到我有一个foreach循环和一个for循环内部来检查_items集合中的标题是否包含一个&#34;否定&#34;短语。否定短语只是意味着如果标题包含它,我想从集合中删除该项目......
这里的问题是,这并不像我想要的那样......?
如果我收藏了100件物品,其中一些是这样的:
Samsung galaxy s8 1200 mAh
Samsung galaxy s8 1200 mAh
Samsung galaxy s7 1200 mAh
Samsung galaxy s7 1200 mAh
Samsung galaxy s6 1200 mAh
如果否定的短语是:
S8 and S7
我得到的输出是:
Samsung galaxy s7 1200 mAh
Samsung galaxy s7 1200 mAh
Samsung galaxy s6 1200 mAh
出于某种原因,似乎第二次foreach循环包含该短语的项目没有从集合中删除,我不确定原因。
有人能帮助我吗?
答案 0 :(得分:3)
您正在跳过物品。
想象一下这个清单:
0 s5
1 s8 <-
2 s7
3 s6
你是索引1. S8匹配,所以你从列表中删除它,现在看起来像这样:
0 s5
1 s7 <-
2 s6
你仍然在索引1,但它现在包含s7。你迭代,你现在在2.你已经跳过了s7,即使它匹配。
如果你向后迭代,这不会发生:
foreach (var item in allNegatives)
{
for (int index = _items.Count() - 1; index >= 0; --index)
{
if (_items[index].Title.IndexOf(item, StringComparison.OrdinalIgnoreCase) >= 0)
{
_items.RemoveAt(index);
}
}
}
答案 1 :(得分:3)
John已经解释了为什么它不会那样工作,你正在迭代所有索引,在这个循环中你要删除项目。这可能导致不正确的结果或例外。
也许你想使用List.RemoveAll
_items.RemoveAll(i => allNegatives.Any(n => i.Title.IndexOf(n, StringComparison.OrdinalIgnoreCase) >= 0));
如果您使用Title.ToLower
,这也可以避免使用OrdinalIgnoreCase
。
答案 2 :(得分:1)
使用LINQ。以下是如何执行此操作的示例:
List<string> list= new List<string>()
{
"Samsung galaxy s8 1200 mAh",
"Samsung galaxy s8 1200 mAh",
"Samsung galaxy s7 1200 mAh",
"Samsung galaxy s7 1200 mAh",
"Samsung galaxy s6 1200 mAh"
};
List<string> negativePhrs= new List<string>(){"s7","s8"};
list = list.Where(x=> !negativePhrs.Any(y=> x.ToLower().Contains(y.ToLower()))).ToList();
foreach(var a in list)
{
Console.WriteLine(a);
}
答案 3 :(得分:1)
我不确定你要做什么。您要删除项目还是allNegatives?
这是否符合您的要求?
var things = new List<Thing> {new Thing { Title="Bob"}, new Thing {Title="Carol"}, new Thing {Title="Dave"}, new Thing {Title="Alice"} };
var items = new List<string> {"foo", "bar", "Alice", "Dave"};
var result = items.Where(x => !things.Exists(y => y.Title == x)).Select(z=>z);
打印
foreach(var r in result)
Console.WriteLine(r);
foo
bar
所以它已经删除了Alice和Dave的物品,因为它们是物品中的标题。但我想也许你想从事物中删除?