2010-09-05 3 views
5

J'ai une tableLINQ pour compter la fréquence de valeur

ID|VALUE 

VALEUR est un champ entier avec des valeurs possibles entre 0 et 4. Comment puis-je interroger le compte de chaque valeur?

Idéalement, le résultat devrait être un tableau avec 6 éléments, un pour le compte de chaque valeur et le dernier est le nombre total de lignes.

Répondre

16

Ce programme simple fait cela:

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

Sortie:

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

version légèrement modifiée pour retourner un tableau avec seulement la nombre de valeurs:

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

Ajout du nombre de lignes à la fin:

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

Voici comment vous obtiendrez le nombre de lignes pour chaque valeur de VALUE, dans l'ordre:

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

Pour obtenir le nombre total de lignes de la table, vous pouvez ajouter tous les chefs ensemble. Vous ne voulez pas que la séquence originale soit itérée deux fois, cependant; cela provoquerait l'exécution de la requête deux fois. Au lieu de cela, vous devriez faire une liste intermédiaire première:

var countsList = counts.ToList(); 

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

ou est-ce que je peux simplement ajouter tous les comptes? puis-je utiliser counts.Sum()? – Rana

+0

Oui, vous pourriez le faire aussi. J'ai édité ma réponse pour le refléter. –

Questions connexes