使用 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
我有一个字符串列表,可以考虑'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