29 votes

Ajout et mise à jour du dictionnaire et de la recherche .net

J'en ai marre de faire des blocs de code comme ça pour les différents morceaux de code que j'ai :

if (dict.ContainsKey[key]) {  
    dict[key] = value;  
}  
else {  
    dict.Add(key,value);  
}

et pour les recherches (c.-à-d. clé -> liste de valeurs)

if (lookup.ContainsKey[key]) {  
    lookup[key].Add(value);  
}  
else {  
    lookup.Add(new List<valuetype>);  
    lookup[key].Add(value);  
}  

Existe-t-il une autre librairie de collections ou une méthode d'extension que je devrais utiliser pour faire cela en une seule ligne de code, quels que soient les types de clé et de valeur ?

par exemple

dict.AddOrUpdate(key,value)  
lookup.AddOrUpdate(key,value)

28voto

Jon Skeet Points 692016

Comme le dit Evgeny, l'indexeur remplacera déjà les valeurs existantes - donc si vous juste Si vous souhaitez définir inconditionnellement la valeur d'une clé donnée, vous pouvez procéder comme suit

dictionary[key] = value;

Le cas le plus intéressant est celui de "récupérer une valeur, ou l'insérer si nécessaire". C'est facile à faire avec une méthode d'extension :

public static TValue GetOrCreateValue<TKey, TValue>
    (this IDictionary<TKey, TValue> dictionary,
     TKey key,
     TValue value)
{
    return dictionary.GetOrCreateValue(key, () => value);
}

public static TValue GetOrCreateValue<TKey, TValue>
    (this IDictionary<TKey, TValue> dictionary,
     TKey key,
     Func<TValue> valueProvider)
{
    TValue ret;
    if (!dictionary.TryGetValue(key, out ret))
    {
        ret = valueProvider();
        dictionary[key] = ret;
    }
    return ret;
}

Notez l'utilisation d'un délégué pour créer la valeur par défaut - cela facilite les scénarios comme celui de la "liste comme valeur" ; vous ne voulez pas créer la liste vide à moins d'y être obligé :

dict.GetOrCreateValue(key, () => new List<int>()).Add(item);

Notez également que la recherche n'est effectuée qu'une seule fois si la clé est déjà présente. ContainsKey y puis chercher la valeur. Cependant, deux recherches sont toujours nécessaires lors de la création de la nouvelle valeur.

14voto

EMP Points 17246

Lors de la mise à jour, il n'est pas nécessaire d'effectuer une vérification. Il suffit d'utiliser :

dict[key] = value

Il remplacera toute valeur existante. Lors de la récupération de la valeur, il n'existe malheureusement pas de méthode unique pratique (comme la méthode setdefault en Python), mais vous pourriez créer votre propre méthode d'extension. Quelque chose comme ceci :

if (!lookup.TryGetValue(key, out value))
{
     value = new List<T>();
     lookup.Add(key, value);
}

4voto

Darin Dimitrov Points 528142

ConcurrentDictionary dans .NET 4.0 a cette belle méthode . Vous pourriez également écrire une méthode d'extension pour cela.

2voto

lockwobr Points 191

Si vous travaillez avec .NET Framework 4 ou une version plus récente, vous pouvez utiliser la fonction Méthode AddOrUpdate

dict.AddOrUpdate(key,value)  

ajouter ou mettre à jour est comme ceci

dict[key] = value;

1voto

Charles Gargent Points 771

Je ne suis pas sûr qu'il existe une méthode comme celle que vous demandez, mais vous pourriez écrire une petite fonction pour cela, ou utiliser le try catch exception, vraisemblablement si vous essayez d'ajouter une valeur qui existe déjà, une exception sera levée. Si vous l'attrapez et l'ignorez... Juste une suggestion

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