【问题标题】:If at least one element of list1 is in list2?如果 list1 的至少一个元素在 list2 中?
【发布时间】:2013-01-29 07:46:54
【问题描述】:

具备以下条件:

public List<int> List1 { get; set; }
...
var x = GiveMeObject(); // x.List2 --> each element on list2 has an Id (int).
...
bool containsAtLeastOne = ???

验证 list1 的至少 1 个元素是否在 list2 中的最简单/最快/最短的方法(在 linq 中)是什么?

谢谢

【问题讨论】:

  • 这就是 Enumerable.Any 方法发挥作用的地方。看看here

标签: c# .net linq list


【解决方案1】:
bool containsAtLeastOne  = x.List2.Any(li => List1.Contains(li.Id));

【讨论】:

    【解决方案2】:

    替代:Intersect

    bool containsAtLeastOne = List1.Intersect(x.List2.Select(e => e.Id)).Any()
    

    如果您的集合越来越大,您应该使用Intersect 而不是Contains,因为Intersect 至少与Contains 一样快。根据您的收藏,Contains 可能会很快变慢。

    如果您的集合非常小(


    如果您不介意非 LINQ 方式和更多代码行,您可以使用

    var tmp = new HashSet<int>(x.List2.Select(e => e.ID));
    tmp.IntersectWith(list1);
    bool containsAtLeastOne = tmp.Any();
    

    这可能会比 LINQ 方法更快。

    【讨论】:

    • 就我而言,我正在比较大量列表,性能至关重要。这就是为什么我选择你的答案作为正确答案。
    • 但是它需要比Contains更多的内存。 @Dryadwoods:请注意,即使是 Enumerable.AnyContains 也会在找到值后立即中断(尽管可能在开头或结尾)。因此,该值存在的可能性越大,与Intersect 的差异越小,即使在大型集合中也是如此。
    • @TimSchmelter 在最佳的情况下,ContainsIntersect 一样快,但永远不会更快。在最坏的情况下,速度差异是巨大的(如exorbitant huge)。您说Intersect 需要更多内存可能是对的,因为它首先将一个集合复制到Set
    • 这大大提升了性能。
    猜你喜欢
    • 2021-06-27
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多