【问题标题】:Intersection of 6 List<int> objects6 个 List<int> 对象的交集
【发布时间】:2010-09-01 14:51:27
【问题描述】:

正如我在标题中提到的,我手上有 6 个 List 对象。我想找到它们的交集,除了那些没有项目的。

intersectionResultSet =
    list1.
    Intersect(list2).
    Intersect(list3).
    Intersect(list4).
    Intersect(list5).
    Intersect(list6).ToList();

当其中一个没有项目时,通常我会得到空集。所以我想从交集操作中排除那些没有项目的项目。最好的方法是什么?

提前致谢,

【问题讨论】:

    标签: c# linq list ienumerable


    【解决方案1】:

    你可以使用这样的东西:

    // Your handful of lists
    IEnumerable<IEnumerable<int>> lists = new[]
        {
            new List<int> { 1, 2, 3 }, 
            new List<int>(), 
            null,
            new List<int> { 2, 3, 4 }
        };
    
    List<int> intersection = lists
        .Where(c => c != null && c.Any())
        .Aggregate(Enumerable.Intersect)
        .ToList();
    
    foreach (int value in intersection)
    {
        Console.WriteLine(value);
    }
    

    这已经过测试并产生以下输出:

    2 3

    感谢@Matajon 指出Enumerable.IntersectAggregate 函数中的使用更简洁(并且性能更高)。

    【讨论】:

      【解决方案2】:

      简单地说,也使用 LINQ。

      var lists = new List<IEnumerable<int>>() { list1, list2, list3, list4, list5, list6 };
      
      var result = lists
          .Where(x => x.Any())
          .Aggregate(Enumerable.Intersect)
          .ToList();
      

      【讨论】:

        【解决方案3】:

        您可以使用 LINQ 获取所有长于 0 的列表,然后将它们发送到您描述的函数。

        另一种选择: 覆盖/扩展“相交”到仅当列表不为空时才在列表上进行相交的函数,并调用它而不是相交。

        【讨论】:

          猜你喜欢
          • 2020-08-16
          • 2022-06-29
          • 2012-03-15
          • 2013-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-11
          • 2022-01-21
          相关资源
          最近更新 更多