2012-04-04 55 views
2

我有一個名爲DiscountableObject的列表。列表中的每個項目都有一個折扣收藏。我需要的是在所有DiscoubtableObjects中通用的折扣列表。LINQ相交,但將結果添加到新列表

代碼:

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

這無疑會返回一個空列表,因爲IntersectionOfDiscounts在一審空。

我想要的是取得DiscountableObject的項目1,將它與下一個DiscountableObject項目進行比較,依此類推。

我知道我在做什麼是錯誤的,因爲我正在做交叉路口和同時增加列表......但是如何讓我感到困惑?

我該如何解決這個問題?

+0

如何增加一些測試數據,以你的榜樣,並提供你想要什麼輸出是? – 2012-04-04 15:29:19

回答

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 2012-04-04 15:31:19

+0

如果你可以爲N個Enumerables(例如Enumerable of Enumerables)執行交集,你可以爲Intersect創建一個新的IEnumerable擴展這經常足夠。 – Servy 2012-04-04 15:32:55

+0

杜!我現在覺得自己像個白癡!除非有更好的答案,否則將在6分鐘內將答案標記爲已接受。謝謝! – Magic 2012-04-04 15:37:25

3

可能更優雅的方式:

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

錯過了你的6分鐘最後期限,但我喜歡它反正...

+0

邁克:6分鐘截止日期不是我的,但是是的;;下一次... – Magic 2012-04-05 10:22:43

相關問題