开发者

Intersection of 6 List<int> objects

开发者 https://www.devze.com 2023-01-14 05:14 出处:网络
As I mentioned in the title I\'ve got 6 List objects in my hand. I want to find the intersection of them except the ones who has no item.

As I mentioned in the title I've got 6 List objects in my hand. I want to find the intersection of them except the ones who has no item.

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

When one of them has no item, normally I get empty set as a result. So I want to exclude the ones that has no item from intersection operation. What's the best way开发者_如何学Python to do that?

Thanks in advance,


You could use something like this:

// 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);
}

This has been tested and produces the following output:

2
3

With thanks to @Matajon for pointing out a cleaner (and more performant) use of Enumerable.Intersect in the Aggregate function.


Simply, using LINQ too.

var lists = new List<IEnumerable<int>>() { list1, list2, list3, list4, list5, list6 };

var result = lists
    .Where(x => x.Any())
    .Aggregate(Enumerable.Intersect)
    .ToList();


You could use LINQ to get all the list that are longer then 0 , and then send them to the function you've described.

Another option : Override/Extend "Intersect" to a function that does Intersect on a list only if it's not empty , and call it instead of Intersect.

0

精彩评论

暂无评论...
验证码 换一张
取 消