1

给定

class Row
{
   public int CustomerId;
   public decimal Purchase;
}

通过客户的总购买量获得另一个系列的最简单方法是什么?基本上是 GroupBy 加上添加的购买。

rows.GroupBy(r => r.CustomerId);

性能不是一个因素,因为集合相当小。

编辑 假设 Row 类有几个属性,我希望分组结果是特定类型,而不是匿名的。

class Row
{
   public int CustomerId;
   public decimal Purchase;
   public string SomeProp1;
   public double SomeProp2;
   public long SomeProp3;
}

class TotalsRow
{
   public int CustomerId;
   public decimal TotalPurchases;
   public string SomeProp1;
   public double SomeProp2;
   public long SomeProp3;
}

EDIT2 刚刚意识到之前的编辑没有意义,因为我正在合并几行。我实际上正在寻找的是包含等于组内所有行的属性。假设除 Purchase 之外的所有上述属性都满足此要求,这就是我想出的解决方案。

rows.GroupBy(r => r.CustomerId)
    .Select(g => new TotalsRow()
                {
                    CustomerId= g.Key, 
                    TotalPurchases = g.Sum(gr => gr.Purchase),
                    SomeProp1 = g.First().SomeProp1);
                    SomeProp2 = g.First().SomeProp2);
                    SomeProp3 = g.First().SomeProp3);
                }
       );
4

2 回答 2

2

你很近。 GroupBy返回一个集合,其中包含一个KeyProperty 和一个遍历该组中项目的枚举器:

rows.GroupBy(r => r.CustomerId)
    .Select(g => new {
                    Customer = g.Key, 
                    TotalPurchases = g.Sum(gr => gr.Purchase)
                    }
           );
于 2013-09-09T13:11:57.517 回答
2
rows.GroupBy(
    r => r.CustomerId,
    r => r.Purchase,
    (id, group) => new
        {
            CustomerId = id,
            SumPurchase = group.Sum()
        }
)

更新
当然,假设SomeProp1-3所有具有相同 CustomerId 的行都是相同的。

第一个变体(行->行)

rows.GroupBy(
    r => r.CustomerId,
    r => r,
    (id, group) => group.Aggregate((result, row) =>
        { result.Purchase += row.Purchase; return result; })
)

第二个变体(Row -> TotalsRow)

rows.GroupBy(
    r => r.CustomerId,
    r => r,
    (id, group) =>
    {
        var first = group.First();
        return new TotalsRow
        {
            CustomerId = id,
            TotalPurchases = group.Sum(r => r.Purchase),
            SomeProp1 = first.SomeProp1,
            SomeProp2 = first.SomeProp2,
            SomeProp3 = first.SomeProp3
        };
    }
)
于 2013-09-09T13:15:40.873 回答