2012-04-04 2 views
2

У меня есть список под названием DiscountableObject. Каждый элемент в списке, в свою очередь, имеет скидку. Мне нужен список скидок, которые являются общими для всех DiscoubtableObjects.LINQ Intersect, но добавьте результат в новый список

Код:

List<Discount> IntersectionOfDiscounts = new List<Discount>(); 
foreach(var discountableItem in DiscoutableObject) 
{ 
    IntersectionOfDiscounts = IntersectionOfDiscounts.Intersect(discountableItem.Discounts);  
} 

Это, несомненно, вернет пустой список потому что IntersectionOfDiscounts был пуст, в первую очередь.

То, что я хочу, - это взять 1-й предмет DiscountableObject, сравнить его со следующим элементом DiscountableObject и так далее.

Я знаю, что я пытаюсь сделать, это неправильно, потому что я делаю пересечение и дополнение к списку в то же время ... но как еще меня озадачивает?

Как мне обойти это?

+0

Как насчет добавления некоторых тестовых данных в вашем примере и обеспечение того, что вы хотите выход будет? –

ответ

4

Инициализировать IntersectionOfDiscounts в первый Список скидок (если их более одного), а не в пустой список. Вы также можете пропустить первый элемент в цикле «foreach».

// add check to ensure at least 1 item. 
List<Discount> IntersectionOfDiscounts = DiscoutableObject.First().Discounts; 
foreach(var discountableItem in DiscoutableObject.Skip(1)) 
{ 
    IntersectionOfDiscounts = IntersectionOfDiscounts.Intersect(discountableItem.Discounts);  
} 
+0

Должен быть более элегантный способ, чем этот ... но да, это сработает :) – Rawling

+0

Вы можете создать новое расширение 'IEnumerable' для Intersect, которое выполнило пересечение в N Enumerables (т.е. Enumerable of Enumerables), если вы делал это достаточно часто. – Servy

+0

Duh! Теперь я чувствую себя идиотом! Отметьте ответ как принятый за 6 минут, если не будет лучшего. Благодаря! – Magic

3

Возможно более элегантный способ:

var intersection = discountableObject 
    .Select(discountableItem => discountableItem.Discounts) 
    .Aggregate((current, next) => current.Intersect(next).ToList()); 

пропустили 6 минут крайний срок, но я все равно люблю его ...

+0

Майк: 6 минутный срок не был моим, но SO's ;-) В следующий раз ... – Magic