2014-10-26 20 views
4

說我有這些類:如何使用LINQ合併樹(和總數)?

public class Option 
{ 
    public int OptionID { get; set; } 
    public bool IsSelected { get; set; } 
} 

public class Product 
{ 
    public int ProductID { get; set; } 
    public int Quantity { get; set; } 
    public List<Option> Options { get; set; } 
} 

比方說,這將是添加一些Product對象爲List<Product>

2x Product 1 OptionID 1 OptionID 1 OptionID 2 OptionID 2

2x Product 1 OptionID 1 OptionID 1 OptionID 2 OptionID 2

後,我的結果,我怎樣才能將這些結果變成使用LINQ(lambda)的單個結果,其中IsSelected = true

4x Product 1 4x OptionID 1 4x OptionID 2

+0

您的最終目標不適用於您當前的'ChartItems'類。 – 2014-10-26 22:59:11

+0

在你的'ChartItems'類中,'Quantity'是否代表'Product'或者'Option'的數量? – 2014-10-26 23:03:58

+0

在你的'ChartItems'類中,'List OptionID'就是所有選擇的'OptionID'值的列表。 – 2014-10-26 23:05:43

回答

1

雖然康拉德的答案很接近,但並不完全符合你的要求。它需要使用匿名類型和兩個組。

這是一個小提琴:https://dotnetfiddle.net/v907me及其最相關的代碼。

var query = products.GroupBy(p => p.ProductID, (key, values) => new 
{ 
    ProductID = key, 
    Quantity = values.Sum(v => v.Quantity), 
    Options = values 
     .SelectMany(v => v.Options.Where(o => o.IsSelected)) 
     .GroupBy(o => o.OptionID, (k, v) => new 
     { 
      OptionID = k, 
      Quantity = v.Count() 
     }) 
}); 
+0

@DeMama雖然我可以添加IsSelected過濾器,但我不確定將結果移植到ChartItems類中的要求。你的問題的這一部分對我來說是不透明的。 – 2014-10-26 23:11:28

2

如果我正確理解你的問題,這是很典型的GroupBy

var result = data.GroupBy(x => x.ProductID, 
         (key, values) => new Product() 
         { 
          ProductID = key, 
          Quantity = values.Sum(p => p.Quantity), 
          Options = values.SelectMany(p => p.Options).ToList() 
         }).ToList(); 

所以result是一個包含產品List<Product>合併對於ProductID