2011-03-15 24 views
6

tengo una tabla con datos similares a continuación:C# LINQ media

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

quiero proyectar una mesa como tal:

Group TimePoint AverageValue 
    1   0   2 
    1   1   4 

EDIT: Los datos están en una tabla de datos.

¿Alguien tiene alguna idea de cómo se puede hacer esto con LINQ o de otra manera?

Gracias.

+3

¿Cómo está almacenando los datos? a 'List '? 'DataTable'? ¿Qué? – thecoop

+0

Hola, es una tabla de datos. –

Respuesta

22

que debe realizar Agrupar por

El LINQ lo que necesita es algo así como:

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) 
      } ; 

Para más muestras de Linq, le recomiendo el 101 Página de muestras de Linq - http://msdn.microsoft.com/en-us/vcsharp/aa336747#avgGrouped

+0

Gracias perfectos. –

2

Usted puede hacer:

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

Suponiendo una clase como esta:

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

Aquí hay un enfoque más orientado a las funciones (como yo prefiero). La primera línea no se compilará, así que llénela con sus datos.

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), 
            } 
       );