web-dev-qa-db-fra.com

Comment puis-je supprimer des éléments du dictionnaire à l'aide de l'expression lambda

Je ne suis pas dans les solutions LINQ,

J'utilise predicat simple pour déterminer si la clé doit être supprimée, Par exemple si le dictionnaire est construit comme Dictionary<int, int>, Alors, comment dois-je supprimer toutes les entrées avec des données négatives

Je préfère utiliser le même dictionnaire, pas pour en créer un nouveau, Je n'ai pas de problèmes de préformance

Y at-il un moyen de le faire, sans utiliser LINQ, mais en utilisant des expressions Lambda?

Je ne voulais pas de solutions dans LINQ parce que personne ne les utilisait dans mon projet, je ne voulais pas être le premier .., mais comme j'ai vu les solutions LINQ mieux paraître, je les utiliserai ..

29
Delashmate

En utilisant simplement l'expression lambda: 

foreach (var i in myDict.Where(d => (d.Value  < 0 || d.key <0)).ToList() ) 
{
  myDict.Remove(i.Key);
}
8
Kamyar
var toRemove = dict.Keys.Where(predicate).ToArray();
foreach (var key in toRemove) {
    dict.Remove(key);
}
2
thecoop

Bien si vous ajoutez

namespace MMExtensions
{
    public static class DictionaryExtensions
    {
        public delegate bool Predicate<TKey, TValue>(KeyValuePair<TKey, TValue> d);

        [MethodImpl(MethodImplOptions.Synchronized)]
        public static void Filter<TKey, TValue>(
            this Dictionary<TKey, TValue> hashtable, Predicate<TKey, TValue> p)
        {
            foreach (KeyValuePair<TKey, TValue> value in hashtable.ToList().Where(value => !p(value)))
                hashtable.Remove(value.Key);
        }
    }
}

Et vous avez eu un ensemble de données comme dictionnaire:

    Dictionary<string, int> d =
            new Dictionary<string, int> {{"v", -3}, {"val1", 1}, {"val2", 2}};

Ensuite, vous pouvez utiliser:

    d.Filter(delegate(KeyValuePair<string, int> kv) { return kv.Value >= 0; });
    d.Filter(kv => kv.Value >= 0);// or as lambda
1
Margus

Voulez-vous supprimer les éléments de ce dictionnaire ou souhaitez-vous utiliser un nouveau dictionnaire sans ces éléments?

var d = new Dictionary<int,int>();
var newDict = d.Where(entry => entry.Value >= 0).ToDictionary(entry => entry.Key, entry => entry.Value);
0
Josh Smeaton

Le plus facile:

Dictionary<long, long> dict...
Dictionary<long, long> result = dict.Were(x => x.Value >= 0).ToDictionary(x => x.Key, x => x.Value);

Ou alors, passez en boucle dans l'ordre inverse et supprimez les invalides.

0
MonkeyDeveloper