检查数组中的字符串是否出现在LINQ中的另一个字符串数组中?

问题描述:

这应该很简单,但LINQ的Contains()不需要数组。 我有2个数组字符串检查数组中的字符串是否出现在LINQ中的另一个字符串数组中?

e.g.1 {“的”,“快速”,“布朗”}

我想比较字符串的另一个数组,如果任何字符串出现在它返回true。

e.g.2 { “这”, “犯规”, “快速”, “工作”}

所以 “快速” 将出现在第二阵列英寸

是否最好使第一个字符串加逗号分隔,因此它看起来像“The,quick,Brown”,然后运行包含在一个循环中?

我相信这可以使用LINQ正确完成。

var first = new[] {"the", "quick", "brown"}; 
var second = new[] {"This","doesnt","quick","Work"}; 

var found = from a in first 
      from b in second 
      where a == b 
      select a; 

if(found.Any()) 
    return true; 
+0

这是O(n * m),而使用'Intersect'应该是O(n + m)。这样的例子无关紧要,但对较大的序列可能会有很大的改变。 – LukeH 2011-03-22 12:25:13

+0

好的谢谢,这是更有效的呢? – jaffa 2011-03-22 12:41:45

+0

@Jon:使用'Intersect'更有效率(尽管如果序列很小,可能并不明显)。 – LukeH 2011-03-22 12:48:46

bool exists = first.Intersect(second).Any(); 

或者,如果你想知道什么是真正的常用词是:

var commonWords = first.Intersect(second); 

foreach (string s in commonWords) 
{ 
    Console.WriteLine(s); 
} 

我想我会用:

var query = from a in first 
      where b.Contains(a) 
      select a; 

var isThereAMatch = query.Any(); 

如果名单是非常大和匹配可能是稀疏的,那么我可以通过使用b的查找/哈希集来优化这个。