2012-04-04 14 views
2

Ich habe eine Liste namens DiscountableObject. Jedes Objekt auf der Liste hat seinerseits eine Rabatt-Sammlung. Was ich brauche, ist eine Liste von Discounts, die in allen DiscoubtableObjects üblich sind.LINQ schneiden, aber das Ergebnis zu einer neuen Liste hinzufügen

Code:

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

Dies wird zweifellos eine leere Liste zurück, weil durch IntersectionOfDiscounts in erster Instanz leer war.

Was ich will ist, nehmen Sie den Gegenstand 1 des DiscountableObject, vergleichen Sie es mit dem nächsten Artikel von DiscountableObject und so weiter.

Ich weiß, was ich versuche zu tun ist falsch, weil ich die Kreuzung und die Ergänzung der Liste zur gleichen Zeit mache ... aber wie sonst noch verblüfft mich?

Wie kann ich das umgehen?

+0

Wie über einige Testdaten zu Ihrem Beispiel das Hinzufügen und das, was Sie wollen der Ausgang sein? –

Antwort

4

Initialisieren Sie IntersectionOfDiscounts zu der ersten Rabattliste (wenn es mehrere gibt) und nicht zu einer leeren Liste. Sie können dann auch das erste Element in der 'foreach'-Schleife überspringen.

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

Es muss einen eleganteren Weg geben als das ... aber ja, es wird funktionieren :) – Rawling

+0

Sie könnten eine neue "IEnumerable" -Erweiterung für Intersect erstellen, die eine Schnittmenge auf N Enumerables (dh eine Enumerable of Enumerables) durchführt, wenn Sie Habe das oft genug gemacht. – Servy

+0

Duh! Ich fühle mich jetzt wie ein Idiot! Wird die Antwort in 6 Minuten als angenommen markiert, es sei denn, es gibt eine bessere Antwort. Vielen Dank! – Magic

3

Möglicherweise eleganteren Weg:

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

Verpasste Ihre 6 Minuten Frist, aber Ich mag es trotzdem ...

+0

Mike: 6 Minuten Deadline war nicht meine, aber SO's ;-) Das nächste Mal ... – Magic

Verwandte Themen