因此,我使用以下语句检查字符串是否包含数组中的某个单词:
if(stringArray.Any(s => stringToCheck.Contains(s)))
简单。现在找到匹配并且该陈述为真。但我想知道数组中哪个项与字符串匹配。上面LINQ语句中的占位符“s”在以下子句中不可用。
希望有人有个主意。我可以循环遍历数组,是的,但LINQ对我来说看起来更好。 =)
答案 0 :(得分:6)
var match = stringArray.FirstOrDefault(s => stringToCheck.Contains(s));
if(match != null) {
// match was found
}
答案 1 :(得分:3)
如果您希望输入列表中的所有字符串都符合条件,则需要使用Where
:
var matchingStrings = stringArray.Where(s => stringToCheck.Contains(s))
如果您只想要第一个字符串,可以使用FirstOrDefault
:
var firstMatchingString = stringArray
.FirstOrDefault(s => stringToCheck.Contains(s))
有关所有可用方法的概述,请查看http://msdn.microsoft.com/en-us/library/bb341635.aspx
有关Linq to Objects的介绍,请查看此处的101个示例:http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
答案 2 :(得分:1)
另一个简单的解决方案(仅一个代码行)只是使用Select
重载:
选择后,我们可以访问当前的value
和 index
:
//Example:
string[] arr = new[] {"a", "bb", "ccc"};
var result = arr.Select((v,i)=>new {value=v, index=i}).Where(x=>x.value.Contains("c"));
这会产生如下结果:
{"ccc", 2}
答案 3 :(得分:1)
另一种(更有效的)方法是Enumerable.Join
:
IEnumerable<string> matches = from str1 in stringArray
join str2 in stringToCheck on str1 equals str2
select str1;
if(matches.Any())
{
string allMatches = string.Join(", ", matches);
Console.Write(allMatches);
}
Why is LINQ JOIN so much faster than linking with WHERE?
或使用Enumerable.Intersect
甚至更高效:
IEnumerable<string> matches = stringArray.Intersect(stringToCheck);
foreach(string common in matches)
{
// ...
}