检查数组中的字符串是否出现在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;
答
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的查找/哈希集来优化这个。
这是O(n * m),而使用'Intersect'应该是O(n + m)。这样的例子无关紧要,但对较大的序列可能会有很大的改变。 – LukeH 2011-03-22 12:25:13
好的谢谢,这是更有效的呢? – jaffa 2011-03-22 12:41:45
@Jon:使用'Intersect'更有效率(尽管如果序列很小,可能并不明显)。 – LukeH 2011-03-22 12:48:46