2010-09-01 1 views
2

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

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

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

Спасибо заранее,

ответ

11

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

// 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.

+0

Большое спасибо! Я собираюсь использовать этот классный кусок кода. – anilca

1

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

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

5

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

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

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