2012-04-04 28 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

相关问题