仅当其中一个字段是特定值时,LINQ才会对多个字段进行分组

Mic*_*lik 5 c# linq wpf

我试图按2个字段(类别,然后是供应商)对列表进行分组,但是值不同.如果类别为"01",则将所有成本加起来.如果类别不是"01",则按类别分组,然后按供应商分组.

一些演示数据:

List<MyItem> myItemList = new List<MyItem>();
myItemList.Add(new MyItem{Vendor="Ven1", Cost=100, Category="01"});
myItemList.Add(new MyItem{Vendor="Ven2", Cost=10, Category="02"});
myItemList.Add(new MyItem{Vendor="Ven3", Cost=50, Category="02"}));
myItemList.Add(new MyItem{Vendor="Ven2", Cost=40, Category="01"});
myItemList.Add(new MyItem{Vendor="Ven2", Cost=20, Category="01"});
myItemList.Add(new MyItem{Vendor="Ven3", Cost=30, Category="02"});
myItemList.Add(new MyItem{Vendor="Ven1", Cost=10, Category="03"});
Run Code Online (Sandbox Code Playgroud)

我目前在做什么:

List<MyItem> groupedItems = myItemList.GroupBy(a=> new {a.Category, a.Vendor})
                                      .Select(b=> new MyItem{
                                            Vendor = b.First().Vendor,
                                            Cost = b.Sum(c => c.Cost),
                                            Category = b.First().Category
                                       }).ToList();
Run Code Online (Sandbox Code Playgroud)

我想做什么(也就是我最好的猜测):

List<MyItem> groupedItems = myItemList.GroupBy(a=> new {a.Category.Where(z=>z.Category.Equals("01:)), a.Vendor})
                                      .Select(b=> new MyItem{
                                            Vendor = b.First().Vendor,
                                            Cost = b.Sum(c => c.Cost),
                                            Category = b.First().Category
                                       }).ToList();
Run Code Online (Sandbox Code Playgroud)

期望的结果:

Category = "01", Vendor = "N/A ", Cost = 160
Category = "02", Vendor = "Ven2", Cost = 10
Category = "02", Vendor = "Ven3", Cost = 80
Category = "03", Vendor = "Ven1", Cost = 10
Run Code Online (Sandbox Code Playgroud)

Me.*_*ame 4

返回GroupBy具有 2 个字段的匿名类型。返回对象内的值可以是任何值。在这种情况下,如果类别为“01”,则可以更改它们:myItemList.GroupBy(a=> new {a.Category, Vendor= a.Category == "01" ? null : a.Vendor})为了与当前代码保持一致,该属性被命名为 Vendor,但可以是任何名称。

在您当前的代码中:

List<MyItem> groupedItems = myItemList
    .GroupBy(a => new {a.Category, Vendor = a.Category == "01" ? null : a.Vendor})
    .Select(b => new MyItem
    {
        Vendor = b.First().Vendor,
        Cost = b.Sum(c => c.Cost),
        Category = b.First().Category
    })
    .ToList();
Run Code Online (Sandbox Code Playgroud)

或者稍作修改,First()您可以重用密钥(并N\A一次性实现) ,而不是一组值

List<MyItem> groupedItems = myItemList
      .GroupBy(a=> new {a.Category, Vendor= a.Category == "01" ? "N/A" : a.Vendor})
      .Select(b=> new MyItem{
            Vendor = b.Key.Vendor,
            Cost = b.Sum(c => c.Cost),
            Category = b.Key.Category
       }).ToList();
Run Code Online (Sandbox Code Playgroud)