Пересечение 6 объектов List <int> - PullRequest
2 голосов
/ 01 сентября 2010

Как я уже упоминал в заголовке, у меня в руке 6 объектов List.Я хочу найти их пересечение, кроме тех, у кого нет предметов.

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

Когда у одного из них нет предметов, обычно я получаю пустой набор в результате.Поэтому я хочу исключить тех, у кого нет элемента, из операции пересечения.Какой лучший способ сделать это?

Заранее спасибо,

Ответы [ 3 ]

11 голосов
/ 01 сентября 2010

Вы можете использовать что-то вроде этого:

// 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.Intersect в функции Aggregate.

5 голосов
/ 01 сентября 2010

Просто, используя LINQ тоже.

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

var result = lists
    .Where(x => x.Any())
    .Aggregate(Enumerable.Intersect)
    .ToList();
1 голос
/ 01 сентября 2010

Вы можете использовать LINQ, чтобы получить весь список длиннее 0, а затем отправить их в функцию, которую вы описали.

Другой вариант: Переопределить / расширить "Пересечь" на функцию, которая выполняет Пересечение в списке, только если он не пустой, и вызвать его вместо Пересечь.

...