2010-09-05 17 views
5

Mam tabeliUżywanie LINQ policzyć częstotliwość wartość

ID|VALUE 

wartość jest liczbą całkowitą z pola możliwych wartości pomiędzy 0 i 4. Jak mogę kwerendy rachubę każdej wartości?

Idealnie wynik powinien być tablicą zawierającą 6 elementów, po jednym dla każdej wartości, a ostatnia z całkowitą liczbą rzędów.

Odpowiedz

16

Ten prosty program właśnie to robi:

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

wyjściowa:

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

wersja nieco zmodyfikowany, aby powrócić tablicę tylko liczba wartości:

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

Dodawanie liczby wierszy na końcu:

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

Oto w jaki sposób można uzyskać liczbę wierszy dla każdej wartości VALUE, w kolejności:

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

Aby uzyskać całkowitą liczbę wierszy w tabeli, można dodać wszystkie liczby razem. Nie chcesz jednak, aby oryginalna sekwencja była powtarzana dwukrotnie; to spowodowałoby, że kwerenda zostanie wykonana dwukrotnie. Zamiast tego, należy złożyć wykaz pośredni pierwszy:

var countsList = counts.ToList(); 

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

lub czy mogę po prostu dodać wszystkie liczby? Czy mogę użyć counts.Sum()? – Rana

+0

Tak, możesz to również zrobić. Zmieniłem moją odpowiedź, aby to odzwierciedlić. –