比较C#中的字符串以及从集合

时间:2017-05-18 12:10:28

标签: c# asp.net asp.net-mvc string c#-4.0

我有一段用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循环包含该短语的项目没有从集合中删除,我不确定原因。

有人能帮助我吗?

4 个答案:

答案 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的物品,因为它们是物品中的标题。但我想也许你想从事物中删除?