什么是两个列表比较LINQ(查询语法或其他方式)搜索两份名单至少一个比赛用LINQ
var A = new [] { 1, 2, 3, ... };
var B = new [] { 4, 1, 5, ... };
bool match =
// Some LINQ expression
这样match
将在至少是真实的最佳方式(平均)第一个列表中的一个元素(本例中为1)等于第二个元素?我不需要知道那里有多少比赛,甚至不知道哪一个匹配,只是至少有一场比赛。
什么是两个列表比较LINQ(查询语法或其他方式)搜索两份名单至少一个比赛用LINQ
var A = new [] { 1, 2, 3, ... };
var B = new [] { 4, 1, 5, ... };
bool match =
// Some LINQ expression
这样match
将在至少是真实的最佳方式(平均)第一个列表中的一个元素(本例中为1)等于第二个元素?我不需要知道那里有多少比赛,甚至不知道哪一个匹配,只是至少有一场比赛。
当然有。
A.Intersect(B).Any();
Intersect
在最不可预料的情况下始终有用。
您可以使用Intersect
,但那会计算所有不需要的匹配。所以Any
比较好,因为它会短路:
bool match = A.Any(a => B.Any(b => b == a));
好点。我从来没有想过'Intersect'在屈服之前完全运作。这说得通。 –
@SimonBelanger对,但最坏的情况是'O(mn)'。当然,最好的情况是'O(m)',但最好的情况并不常见。 '相交',otoh,总是'O(m + n)'。 –
@newStackExchangeInstance它真的归结为具体情况。感谢这些信息,总是好奇地看到不同的LINQ操作员的复杂性。 –
您正在寻找的Intersect
组合和Any
bool match = A.Intersect(B).Any();
你也可以使用
A.Any(x => B.Contains(x))
嗯,是的......但那是(最坏的情况)'O(mn)',而'Intersect'是'O(m + n)'(始终) –
从来没有真正想过 –
你能扩大为什么这是正确的,而不是其他人? –
@EricB他们都是正确的,因为他们会给你同样的答案。这是大集合中最高效的。 –
@EricB对,这个小组的表现大致相同(99%的时间更好),并且更好的是大组。 –