C#自定义对象的聚合

时间:2013-01-14 06:20:16

标签: c# aggregation

我有一个List<Fields>集合,其中类Fields具有以下属性

(Name, Currency, Amount, Date, OtherList)其中OtherList是List

示例值

Name  Currency  Amount Date         F1    F2    F3  
ABC   XX        12     12 Jan 2013  X     Y     Z  
BCA   YY        11     12 Jan 2013  A     B     C  
ABC   XX        10     13 Jan 2013  X     Y     Z 

现在,OtherList对象的(X, Y, Z)值为record1(A, B, C) et.el

的值为record2

我需要做的是在名称,货币,F1,F2和F3字段上对上面的列表应用聚合,以便结果如下。

输出

Name  Currency  Amount Date         F1    F2    F3  
ABC   XX        22     13 Jan 2013  X     Y     Z  
BCA   YY        11     12 Jan 2013  A     B     C  

知道我该怎么做吗?

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用LINQ:

var aggrList = list
    .GroupBy(x => new { x.Name, x.Currency, x.F1, x.F2, x.F3 })
    .Select(grp => new {
            Name = grp.First().Name,
            Currency = grp.First().Currency,
            Amount = grp.Sum(x=>x.Amount),
            Date = grp.Max(x=>x.Date),
            F1 = grp.First().F1,    
            F2 = grp.First().F2,    
            F3 = grp.First().F3,    
        });

答案 1 :(得分:0)

尝试以这种方式分组:

list.Where(x => x.OtherList != null && x.OtherList.Count >= 3 )
    .GroupBy(x => new {F1 = x.OtherList[0], F2 = x.OtherList[1], F3 = x.OtherList[2]})
    .Select(g => new
    {
        Name = g.First().Name,
        Currency = g.First().Currency,
        Amount = g.Sum(x => x.Amount),
        Date = g.Max(x => x.Date),
        F1 = g.Key.F1,
        F2 = g.Key.F2,
        F3 = g.Key.F3,
    });

我想对于Date,您将应用Max()函数,金额 - Sum(),但您计划如何为NameCurrency字段应用汇总?