2013-07-01 35 views
16

什么是两个列表比较LINQ(查询语法或其他方式)搜索两份名单至少一个比赛用LINQ

var A = new [] { 1, 2, 3, ... }; 
var B = new [] { 4, 1, 5, ... }; 

bool match = 
    // Some LINQ expression 

这样match将在至少是真实的最佳方式(平均)第一个列表中的一个元素(本例中为1)等于第二个元素?我不需要知道那里有多少比赛,甚至不知道哪一个匹配,只是至少有一场比赛。

回答

26

当然有。

A.Intersect(B).Any(); 

Intersect在最不可预料的情况下始终有用。

+1

你能扩大为什么这是正确的,而不是其他人? –

+2

@EricB他们都是正确的,因为他们会给你同样的答案。这是大集合中最高效的。 –

+0

@EricB对,这个小组的表现大致相同(99%的时间更好),并且更好的是大组。 –

6

您可以使用Intersect,但那会计算所有不需要的匹配。所以Any比较好,因为它会短路:

bool match = A.Any(a => B.Any(b => b == a)); 
+0

好点。我从来没有想过'Intersect'在屈服之前完全运作。这说得通。 –

+3

@SimonBelanger对,但最坏的情况是'O(mn)'。当然,最好的情况是'O(m)',但最好的情况并不常见。 '相交',otoh,总是'O(m + n)'。 –

+0

@newStackExchangeInstance它真的归结为具体情况。感谢这些信息,总是好奇地看到不同的LINQ操作员的复杂性。 –

2

您正在寻找的Intersect组合和Any

bool match = A.Intersect(B).Any(); 
3

你也可以使用

A.Any(x => B.Contains(x)) 
+1

嗯,是的......但那是(最坏的情况)'O(mn)',而'Intersect'是'O(m + n)'(始终) –

+0

从来没有真正想过 –