2011-01-13 66 views
5

我在List<object>内有类似内容,其中object包含Cat,TypeItems分组数据和在C#中进行聚合计算

Cat | Type | Items 
-------------------- 
A | P | 3 
A | Q | 4 
A | R | 2 
A | P | 1 
A | Q | 5 
B | P | 2 
B | Q | 1 
B | R | 3 
B | P | 9 

我想要做的是计算类型的平均项目,以便产生这样的:

Cat | Type | Items 
-------------------- 
A | P | 2 
A | Q | 4.5 
A | R | 2 
B | P | 5.5 
B | Q | 3 
B | R | 5 

正如你所看到的平均项计算的各类 最新最好的方式去做这个?

+0

可以包括数据结构是什么样的线路?元组列表? – vlad 2011-01-13 22:59:42

回答

7

假设输入在被称为IEnumerable<Blah>类型的list变量被设置(含有,例如,一个数据库查询结果,List<Blah>,阵列,etc.etc。),并且Blah是与字段或属性的类所谓CatTypeItems

var result = list.GroupBy(entry => new { entry.Cat, entry.Type }) 
       .Select(group => new { group.Key.Cat, group.Key.Type, 
             Items = group.Average(e => e.Items) }) 
2
class Stuff 
{ 
    public string Cat { get; set; } 
    public string Type { get; set; } 
    public double Items { get; set; } 
} 

static void Main(string[] args) 
{ 
    var list = new List<Stuff>(); 
    list.Add(new Stuff { Cat = "A", Type = "P", Items = 3 }); 
    list.Add(new Stuff { Cat = "A", Type = "Q", Items = 4 }); 
    list.Add(new Stuff { Cat = "A", Type = "R", Items = 2 }); 
    list.Add(new Stuff { Cat = "A", Type = "P", Items = 1 }); 
    list.Add(new Stuff { Cat = "A", Type = "Q", Items = 5 }); 
    list.Add(new Stuff { Cat = "B", Type = "P", Items = 2 }); 
    list.Add(new Stuff { Cat = "B", Type = "Q", Items = 1 }); 
    list.Add(new Stuff { Cat = "B", Type = "R", Items = 3 }); 
    list.Add(new Stuff { Cat = "B", Type = "P", Items = 9 }); 

    var result = from stuff in list 
       group stuff by new { stuff.Cat, stuff.Type } into g 
       select new { Cat = g.Key.Cat, 
           Type = g.Key.Type, 
           AvgItems = g.Average(s => s.Items) }; 

    foreach(var s in result) 
    { 
     Console.WriteLine("{0} | {1} | {2}", s.Cat, s.Type, s.AvgItems); 
    } 
} 
相关问题