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

Using List<string>.Any() to find if a string contains an item as well as find the matching item?

我有一个字符串列表,可以考虑'filters'.

例如:

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 是否包含水果,如果包含,还可以获取水果符合查询。如果我能得到 'filters' 中的匹配索引,那应该没问题。也就是说,对于循环的第一次迭代,它应该 return 0('Apple' 的索引),对于第二次迭代,return null 或类似负值的东西,对于第三次迭代,它应该 return 2('Banana' 的索引)。

我在 SO 和 Google 中进行了检查,但找不到我要找的东西。

你想要 FirstOrDefault 而不是任何。

FirstOrDefault 将 return 第一个匹配的对象(如果找到)或默认值(通常为 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));

return 元素索引的可能方法

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 字符串不匹配。如果你想要不区分大小写,你可以使用 IndexOf 和 StringComparison operator