4

因此,我使用以下语句检查字符串是否包含数组中的某个单词:

if(stringArray.Any(s => stringToCheck.Contains(s)))

简单的。现在找到了一个匹配项,并且该陈述为真。但我也想知道数组中的哪个项目与字符串匹配。上述 LINQ 语句中的占位符“s”在以下子句中不可用。

希望有人有想法。我可以遍历数组,是的,但是 LINQ 对我来说看起来更好。=)

4

4 回答 4

6
var match = stringArray.FirstOrDefault(s => stringToCheck.Contains(s));
if(match != null) {
    // match was found
}
于 2012-12-03T08:11:01.893 回答
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

于 2012-12-03T08:11:20.940 回答
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}
于 2012-12-03T08:18:44.057 回答
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);
}

为什么 LINQ JOIN 比使用 WHERE 链接快得多?

或者甚至更有效地使用Enumerable.Intersect

IEnumerable<string> matches = stringArray.Intersect(stringToCheck);
foreach(string common in matches)
{
    // ...
}
于 2012-12-03T08:19:26.200 回答