使用List. any()查找字符串是否包含项以及查找匹配项

本文关键字:查找 包含项 是否 字符串 使用 string any List | 更新日期: 2023-09-27 18:18:05

我有一个字符串列表,可以认为是'过滤器'。

例如:

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以及谷歌,但无法找到我正在寻找的东西。

使用List<string>. any()查找字符串是否包含项以及查找匹配项

你想要的是FirstOrDefault而不是Any

FirstOrDefault将返回第一个匹配的对象,如果找到,或者如果没有找到默认值(通常为null)。

您可以使用List<T>.Find方法:

foreach (string msg in msgList)
{
    var fruit = filters.Find(msg.Contains);
    if (fruit != null)
    {
        // Do something.
    }
}
List<string> filters = new List<string>() { "Apple", "Orange", "Banana" };
string msg = "This sentence contains the word Apple.";
var fruit = Regex.Matches(msg, @"'w+", RegexOptions.IgnoreCase)
            .Cast<Match>()
            .Select(x=>x.Value)
            .FirstOrDefault(s => filters.Contains(s));

返回元素索引的一种可能方法

foreach (string msg in msgList)
{
   var found = filters.Select((x, i) => new {Key = x, Idx = i})
                      .FirstOrDefault(x => msg.Contains(x.Key));
   Console.WriteLine(found?.Idx);
}

还要注意Contains是区分大小写的,所以banana字符串不会与banana字符串匹配。如果想要不区分大小写,可以使用StringComparison操作符

的IndexOf