2011-03-15 62 views
6

我有一个数据的表格类似如下:C#的LINQ平均

Group TimePoint Value 
    1   0   1 
    1   0   2 
    1   0   3 
    1   1   3 
    1   1   5 

我希望以一个表作为这样的:

Group TimePoint AverageValue 
    1   0   2 
    1   1   4 

编辑:数据是一个数据表。

任何人有任何想法如何可以用LINQ或其他方式做到这一点?

谢谢。

+3

你是如何存储数据的?一个'列表'? 'DataTable'?什么? – thecoop 2011-03-15 15:04:30

+0

嗨,这是一个数据表。 – 2011-03-15 15:05:48

回答

22

您需要执行组通过

你需要的LINQ是一样的东西:

var query = from item in inputTable 
      group item by new { Group = item.Group, TimePoint = item.TimePoint } into grouped 
      select new 
      { 
       Group = grouped.Key.Group, 
       TimePoint = grouped.Key.TimePoint, 
       AverageValue = grouped.Average(x => x.Value) 
      } ; 

更多LINQ的样本,我极力推荐101 Linq示例页面 - http://msdn.microsoft.com/en-us/vcsharp/aa336747#avgGrouped

+0

完美谢谢。 – 2011-03-15 15:20:43

2

你可以这样做:

IEnumerable<MyClass> table = ... 

var query = from item in table 
      group item by new { item.Group, item.TimePoint } into g 
      select new 
      { 
       g.Key.Group, 
       g.Key.TimePoint, 
       AverageValue = g.Average(i => i.Value) 
      }; 
1

假设类似如下:

public class Record 
{ 
    public int Group {get;set;} 
    public int TimePoint {get;set;} 
    public int Value {get;set;} 
} 

var groupAverage = from r in records 
        group r by new { r.Group, r.TimePoint } into groups 
        select new 
          { 
          Group = groups.Key.Group, 
          TimePoint = groups.Key.TimePoint, 
          AverageValue = groups.Average(rec => rec.Value) 
          }; 
4

这里有一个更加面向功能的方法(我喜欢它的方式)。第一行不会编译,所以请用数据填写。

var items = new[] { new { Group = 1, TimePoint = 0, Value = 1} ... }; 
var answer = items.GroupBy(x => new { TimePoint = x.TimePoint, Group = x.Group }) 
        .Select(x => new { 
            Group = x.Key.Group, 
            TimePoint = x.Key.TimePoint, 
            AverageValue = x.Average(y => y.Value), 
            } 
       );