2010-09-05 33 views
5

Tengo una tablamediante LINQ para contar la frecuencia valor

ID|VALUE 

VALOR es un campo entero con posibles valores entre 0 y 4. ¿Cómo puedo consultar el recuento de cada valor?

Idealmente, el resultado debería ser una matriz con 6 elementos, uno para el recuento de cada valor y el último es el número total de filas.

Respuesta

16

Este sencillo programa hace exactamente eso:

class Record 
{ 
    public int Id { get; set; } 
    public int Value { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Record> records = new List<Record>() 
     { 
      new Record() { Id = 1, Value = 0}, 
      new Record() { Id = 2, Value = 1 }, 
      new Record() { Id = 3, Value = 2 }, 
      new Record() { Id = 4, Value = 3 }, 
      new Record() { Id = 5, Value = 4 }, 
      new Record() { Id = 6, Value = 2 }, 
      new Record() { Id = 7, Value = 3 }, 
      new Record() { Id = 8, Value = 1 }, 
      new Record() { Id = 9, Value = 0 }, 
      new Record() { Id = 10, Value = 4 } 
     }; 

     var query = from r in records 
        group r by r.Value into g 
        select new {Count = g.Count(), Value = g.Key}; 

     foreach (var v in query) 
     { 
      Console.WriteLine("Value = {0}, Count = {1}", v.Value, v.Count); 
     } 
    } 
} 

Salida:

Value = 0, Count = 2 
Value = 1, Count = 2 
Value = 2, Count = 2 
Value = 3, Count = 2 
Value = 4, Count = 2 

versión ligeramente modificada para devolver una matriz con sólo el recuento de valores:

int[] valuesCounted = (from r in records 
         group r by r.Value 
         into g 
         select g.Count()).ToArray(); 

Agregar el recuento de filas al final:

valuesCounted = valuesCounted.Concat(new[] { records.Count()}).ToArray(); 
3

Aquí es cómo se podrían obtener el número de filas para cada valor de VALUE, en orden:

var counts = 
    from row in db.Table 
    group row by row.VALUE into rowsByValue 
    orderby rowsByValue.Key 
    select rowsByValue.Count(); 

Para obtener el número total de filas en la tabla, puede agregar todas las cuentas juntos. Sin embargo, no desea que la secuencia original se repita dos veces; eso haría que la consulta se ejecute dos veces. En su lugar, usted debe hacer una lista intermedia primero:

var countsList = counts.ToList(); 

var countsWithTotal = countsList.Concat(new[] { countsList.Sum() }); 
+1

o puedo simplemente agregar todos los recuentos? ¿Puedo usar count.Sum()? – Rana

+0

Sí, podrías hacer eso también. He editado mi respuesta para reflejarlo. –

Cuestiones relacionadas