2011-09-08 4 views

Répondre

3

simple avec LINQ:

var months = data.Select(dict => dict["Month"]).Distinct().ToList(); 

Ou sinon tous les dictionnaires avaient l'entrée:

var months = data.Select(dict => { 
          string value; 
          bool hasValue = dict.TryGetValue("Month", out value); 
          return new { value, hasValue }; 
         }) 
       .Where(p => p.hasValue) 
       .Select(p => p.value) 
       .Distinct() 
       .ToList(); 

EDIT: Ma version originale ne comprenait pas l'appel Distinct, il aurait doublons inclus. Ça ne va pas maintenant.

+0

mais cette liste contiendra des doublons non? –

+0

Sélectionne-t-il tous les mois? On dirait qu'une sorte de Distinct/GroupBy devrait être ici pour des mois différents/uniquue? – sll

+0

@Davide: Pas maintenant j'ai ajouté des appels distincts :) –

0

Si vous ne pouvez pas utiliser LINQ:

List<string> months = new List<string>(); 
foreach (Dictionary<string, string> aDict in data) 
{ 
    string aMonth; 
    if (aDict.TryGetValue("Month", out aMonth)) 
     months.Add(aMonth); 
} 

EDIT:

Si vous ne voulez pas les doublons:

List<string> months = new List<string>(); 
foreach (Dictionary<string, string> aDict in data) 
{ 
    string aMonth; 
    if (aDict.TryGetValue("Month", out aMonth) && !months.Contains(aMonth)) 
     months.Add(aMonth); 
} 
+0

Vous pourriez utiliser un HashSet pour de meilleures performances pour supprimer les doublons, puis copier le résultat dans une liste pour la sortie – Kurru

+0

Vous avez raison. Cela dépend simplement de ce qu'il veut obtenir. L'ordre est-il important? De plus, la performance d'insertion pour le HashSet est pire que celle d'une simple liste, donc je ne sais pas si ça en vaut la peine, ça dépend évidemment des chiffres. –

+0

L'insertion pour un HashSet est seulement légèrement pire que l'insertion dans une liste, mais la recherche de "obtient" dans hashmap est O (1) tandis que O (n) pour la liste. – Kurru

1

Ou si vous voulez un (rendement d'une doublure valeurs distinctes, et fonctionne toujours sinon tous les dictionnaires ont l'entrée)

var result=data.SelectMany(x => x) 
    .ToLookup(kv => kv.Key, kv => kv.Value)["Month"].Distinct().ToList(); 
Questions connexes