【发布时间】:2017-03-28 13:54:36
【问题描述】:
我有一个字符串列表,可以将其视为“过滤器”。
例如:
List<string> filters = new List<string>();
filters.Add("Apple");
filters.Add("Orange");
filters.Add("Banana");
我有另一个字符串列表,其中包含句子。
例子:
List<string> msgList = new List<string>();
msgList.Add("This sentence contains the word Apple.");
msgList.Add("This doesn't contain any fruits.");
msgList.Add("This does. It's a banana.");
现在我想找出 msgList 中的哪些项目包含水果。为此,我使用以下代码:
foreach(string msg in msgList)
{
if(filters.Any(msg.Contains))
{
// Do something.
}
}
我想知道,在 Linq 中是否有一种方法可以使用类似于 List.Any() 的方法来检查 msgList 是否包含水果,如果包含,还可以获取与查询匹配的水果。如果我可以在“过滤器”中获得匹配的索引,那应该没问题。也就是说,对于循环的第一次迭代它应该返回 0('Apple' 的索引),对于第二次迭代返回 null 或类似负值的东西,对于第三次迭代它应该返回 2('Banana' 的索引) .
我在 SO 和 Google 中进行了检查,但找不到我正在寻找的确切内容。
【问题讨论】:
-
Banana字符串与banana不同。您需要不区分大小写的搜索吗? -
msgList.Add("What if I like apples, oranges, and bananas?"); -
史蒂夫,是的,你是对的。我真的不介意这种情况,但假设不区分大小写更好。
-
格特,很好看。我想我应该更好地提出我的问题,因为我的实际消息列表中的任何单个字符串都只包含一个“水果”。我确实希望 'bananas' 返回 true,因为 'banana' 是一个子字符串。
-
在这种情况下,将您的
msg.Contains更改为filter => msg.IndexOf(filter, StringComparison.OrdinalIgnoreCase) >= 0),这将使.Contains不区分大小写。如果你看at the source forbool Contains(string value),你会发现它只是return ( IndexOf(value, StringComparison.Ordinal) >=0 );