2010-01-25 11 views

Répondre

43

Depuis dictionnaire implémente IEnumerable<KeyValuePair<Key, Value>>, vous pouvez simplement utiliser où:

var matches = dictionary.Where(kvp => !kvp.Value.BooleanProperty); 

Pour recréer un nouveau dictionnaire si vous en avez besoin, utilisez la méthode ToDictionary.

+7

LINQ rend la vie si facile! :) – SirDemon

69

Si vous ne se soucient pas de créer un nouveau dictionnaire avec les articles désirés et jeter l'ancien, essayez simplement:

dic = dic.Where(i => i.Value.BooleanProperty) 
     .ToDictionary(i => i.Key, i => i.Value); 

Si vous ne pouvez pas créer un nouveau dictionnaire et la nécessité de modifier la ancien pour une raison quelconque (comme quand il est référencé à l'extérieur et vous ne pouvez pas mettre à jour toutes les références:.

foreach (var item in dic.Where(item => !item.Value.BooleanProperty).ToList()) 
    dic.Remove(item.Key); 

Notez que ToList est nécessaire ici puisque vous modifiez la collection sous-jacente Si vous modifiez la collection sous-jacente, l'énumérateur travaillant sur il pour interroger les valeurs sera inutilisable et lèvera une exception dans l'itération de boucle suivante. ToList met en cache les valeurs avant de modifier le dictionnaire.

+1

Je me demandais quels paramètres j'avais besoin de transmettre dans la méthode ToDictionary. Je vous remercie! +1 – contactmatt

7

Vous pouvez simplement utiliser la clause where Linq:

var filtered = from kvp in myDictionary 
       where !kvp.Value.BooleanProperty 
       select kvp 
0

I a ajouté la méthode d'extension suivante pour mon projet qui vous permet de filtrer un IDictionary.

public static IDictionary<keyType, valType> KeepWhen<keyType, valType>(
    this IDictionary<keyType, valType> dict, 
    Predicate<valType> predicate 
) { 
    return dict.Aggregate(
     new Dictionary<keyType, valType>(), 
     (result, keyValPair) => 
     { 
      var key = keyValPair.Key; 
      var val = keyValPair.Value; 

      if (predicate(val)) 
       result.Add(key, val); 

      return result; 
     } 
    ); 
} 

Utilisation:

IDictionary<int, Person> oldPeople = personIdToPerson.KeepWhen(p => p.age > 29); 
Questions connexes