86 votes

Filtrage des valeurs d'un dictionnaire générique C#

J'ai un dictionnaire C#, Dictionary<Guid, MyObject> que je dois filtrer en fonction d'une propriété de MyObject.

Par exemple, je veux supprimer tous les enregistrements du dictionnaire où MyObject.BooleanProperty = false. Quelle est la meilleure façon d'y parvenir ?

88voto

Lee Points 63849

Puisque le dictionnaire implémente IEnumerable<KeyValuePair<Key, Value>>, vous pouvez simplement utiliser Where :

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

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

9voto

Oded Points 271275

Vous pouvez simplement utiliser la clause Linq where :

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

4voto

Ryan Williams Points 359
    public static Dictionary<TKey, TValue> Where<TKey, TValue>(this Dictionary<TKey, TValue> instance, Func<KeyValuePair<TKey, TValue>, bool> predicate)
    {
        return Enumerable.Where(instance, predicate)
                         .ToDictionary(item => item.Key, item => item.Value);
    }

3voto

Andi Points 783

Voici une solution générale, travaillant non seulement pour les propriétés booléennes des valeurs.

Méthode

Rappel : Les méthodes d'extension doivent être placées dans des classes statiques. N'oubliez pas l'instruction using System.Linq; en haut du fichier source.

    /// <summary>
    /// Creates a filtered copy of this dictionary, using the given predicate.
    /// </summary>
    public static Dictionary<K, V> Filter<K, V>(this Dictionary<K, V> dict,
            Predicate<KeyValuePair<K, V>> pred) {
        return dict.Where(it => pred(it)).ToDictionary(it => it.Key, it => it.Value);
    }

Utilisation

Exemple :

    var onlyWithPositiveValues = allNumbers.Filter(it => it.Value > 0);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X