La performance est presque identique à 100%. Vous pouvez vérifier cela en ouvrant la classe dans Reflector.net
C'est l'indexeur This:
public TValue this[TKey key]
{
get
{
int index = this.FindEntry(key);
if (index >= 0)
{
return this.entries[index].value;
}
ThrowHelper.ThrowKeyNotFoundException();
return default(TValue);
}
set
{
this.Insert(key, value, false);
}
}
Et voici la méthode Add:
public void Add(TKey key, TValue value)
{
this.Insert(key, value, true);
}
Je ne publierai pas toute la méthode Insert car elle est plutôt longue, mais la déclaration de la méthode est la suivante:
private void Insert(TKey key, TValue value, bool add)
Et plus bas dans la fonction, cela se produit:
if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key))
{
if (add)
{
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
}
Ce qui vérifie si la clé existe déjà, et si c'est le cas et si le paramètre add est vrai, il lève l'exception.
Donc, à toutes fins et intentions, la performance est la même.
Comme quelques autres mentions, il s'agit de savoir si vous avez besoin de la vérification, pour les tentatives d'ajout de la même clé deux fois.
Désolé pour le long post, j'espère que ça va.
La première version ajoutera un nouveau KeyValuePair au dictionnaire, jetant si la clé est déjà dans le dictionnaire. Le second, en utilisant l'indexeur, ajoutera une nouvelle paire si la clé n'existe pas, mais écrasera la valeur de la clé si elle existe déjà dans le dictionnaire.
la source
Dictionary.Add(key, value)
etDictionary[key] = value
ont des objectifs différents:Add
méthode pour ajouter une nouvelle paire clé / valeur, les clés existantes ne seront pas remplacées (unArgumentException
est lancé).la source
Pour répondre à la question, nous devons d'abord examiner le but d'un dictionnaire et la technologie sous-jacente.
Dictionary
est la listeKeyValuePair<Tkey, Tvalue>
où chaque valeur est représentée par sa clé unique. Disons que nous avons une liste de vos aliments préférés. Chaque valeur (nom de l'aliment) est représentée par sa clé unique (une position = combien vous aimez cet aliment).Exemple de code:
Disons que vous voulez rester en bonne santé, que vous avez changé d'avis et que vous voulez remplacer votre "Burger" préféré par une salade. Votre liste est toujours une liste de vos favoris, vous ne changerez pas la nature de la liste. Votre favori restera numéro un sur la liste, seule sa valeur changera. C'est à ce moment que vous appelez ceci:
Mais n'oubliez pas que vous êtes le programmeur, et à partir de maintenant vous finissez vos phrases avec; vous refusez d'utiliser des emojis car ils généreraient une erreur de compilation et toute la liste des favoris est basée sur un index 0.
Votre alimentation a également changé! Vous modifiez donc à nouveau votre liste:
Il y a deux possibilités avec la définition, soit vous voulez donner une nouvelle définition pour quelque chose qui n'existait pas auparavant, soit vous voulez changer la définition qui existe déjà.
La méthode Add vous permet d'ajouter un enregistrement mais à une seule condition: la clé de cette définition peut ne pas exister dans votre dictionnaire.
Maintenant, nous allons regarder sous le capot. Lorsque vous créez un dictionnaire, votre compilateur effectue une réservation pour le bucket (espaces en mémoire pour stocker vos enregistrements). Le bucket ne stocke pas les clés de la manière dont vous les définissez. Chaque clé est hachée avant d'aller dans le compartiment (défini par Microsoft), il convient de mentionner que la partie valeur reste inchangée.
J'utiliserai l'algorithme de hachage CRC32 pour simplifier mon exemple. Lorsque vous définissez:
Ce qui va dans le seau est db2dc565 "Pizza" (simplifié).
Lorsque vous modifiez la valeur avec:
Vous hachez votre 0 qui est à nouveau db2dc565 puis vous recherchez cette valeur dans votre bucket pour savoir si elle est là. Si c'est là, vous réécrivez simplement la valeur assignée à la clé. Si ce n'est pas là, vous placerez votre valeur dans le seau.
Lorsque vous appelez la fonction Ajouter sur votre dictionnaire comme:
Vous hachez votre 0 pour comparer sa valeur à celles du compartiment. Vous ne pouvez le placer dans le seau que s'il n'y est pas .
Il est crucial de savoir comment cela fonctionne, surtout si vous travaillez avec des dictionnaires de clé de type chaîne ou char. Il est sensible à la casse en raison du hachage. Donc par exemple "nom"! = "Nom". Utilisons notre CRC32 pour illustrer cela.
La valeur de «nom» est: e04112b1 La valeur de «nom» est: 1107fb5b
la source
Oui, c'est la différence, la méthode Add lève une exception si la clé existe déjà.
La raison d'utiliser la méthode Add est exactement la suivante. Si le dictionnaire n'est pas censé contenir déjà la clé, vous voulez généralement l'exception pour que vous soyez informé du problème.
la source
Compte tenu des similitudes les plus probables en termes de performances, utilisez ce qui vous semble le plus correct et lisible pour le morceau de code que vous utilisez.
Je sens qu'une opération qui décrit un ajout, étant la présence de la clé déjà une exception vraiment rare est mieux représentée avec l'ajout. Sémantiquement, cela a plus de sens.
Le
dict[key] = value
représente mieux une substitution. Si je vois ce code, je m'attends à moitié que la clé soit déjà dans le dictionnaire de toute façon.la source
dic[key] = value
que la clé soit déjà présente, mais je suppose que c'est discutable;)L'un attribue une valeur tandis que l'autre ajoute au dictionnaire une nouvelle clé et une nouvelle valeur.
la source
Pour insérer la valeur dans le dictionnaire
la source