【问题标题】:Search two lists for at least one match with LINQ使用 LINQ 在两个列表中搜索至少一个匹配项
【发布时间】:2013-07-01 18:25:40
【问题描述】:

用 LINQ(查询语法或其他方式)比较两个列表的最佳方式(平均而言)是什么

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

bool match = 
    // Some LINQ expression

当第一个列表中的至少一个元素(在本例中为 1)等于第二个列表中的一个元素时,match 是否为真?我不需要知道有多少匹配,甚至是匹配哪一个,只要至少有一个匹配即可。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    当然有。

    A.Intersect(B).Any();
    

    Intersect 在最意想不到的情况下总是有用的。

    【讨论】:

    • @EricB 他们都是正确的,因为他们会给你相同的答案。这对于大型集合来说是最有效的。
    • @EricB 对,这在小集合中的表现大致相同(99% 的时间更好),在大集合中表现更好。
    • 我很好奇,所以我测试了一下。事实证明,当A 明显大于B(即A 中为10K-1M,而B 中为10)时,A.Intersect(B).Any() 明显比@987654328 快(70%-90%) @。这是因为Intersect首先通过完全迭代第二个参数来构建内部集,然后仅根据需要迭代第一个参数。
    【解决方案2】:

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

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

    【讨论】:

    • 好点。我从没想过Intersect 在屈服之前完全运作。这是有道理的。
    • @SimonBelanger 对,但最坏的情况是 O(mn)。当然,最好的情况是O(m),但最好的情况并不常见。 Intersect,otoh,永远是O(m+n)
    • @newStackExchangeInstance 这真的归结为具体情况。感谢您提供的信息,总是想知道不同 LINQ 运算符的复杂性。
    • OP:Any 更好的事实取决于具体情况,因此请停止传播可能(并且可能)不正确的事实。
    • 即使Intersect 使用延迟执行。正如您所说,它确实不需要需要生成整个交集来回答这个问题。如果第一个集合中的第一个项目存在于第二个集合中,那么它将在找到那个值后停止,它不会继续检查剩余的元素。唯一的问题是在检查第一个值时第二个参数被加载到HashSet 中。这相当于迭代整个集合,您在每次迭代时都会这样做。简而言之,如果第一组中的第一个项目是匹配项,这会更快一点,否则会更慢。
    【解决方案3】:

    你也可以使用

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

    【讨论】:

    • 嗯,是的...但那是(最坏的情况)O(mn),而IntersectO(m+n)(一直)
    • 从来没有想过这个
    【解决方案4】:

    您正在寻找IntersectAny 的组合

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

    【讨论】:

      猜你喜欢
      • 2011-12-02
      • 1970-01-01
      • 2013-12-21
      • 2017-10-01
      • 2022-01-21
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多