web-dev-qa-db-fra.com

Comment ajouter des clés en double dans le dictionnaire

J'ai quelques lignes de fichiers texte que je veux ajouter au dictionnaire.J'utilise le dictionnaire pour la première fois.Pendant l'ajout des lignes de départ, c'était Ok mais tout à coup, j'ai l'erreur

Un article avec la même clé a déjà été ajouté

Ici, dans mon code, il y a des clés en double que je ne peux pas changer. Voici mon code en c #

Dictionary<string, string> previousLines = new Dictionary<string, string> { };
previousLines.Add(dialedno, line);

Ici dialedno est la clé et la ligne est la ligne de fichier texte . Voici le code à partir duquel je récupère la ligne donnée en fonction de la clé.

string tansferOrginExt = previousLines[dialedno];

Donc, ma préoccupation est de savoir comment autoriser l’ajout de clés en double dans le dictionnaire, si possible, et comment puis-je obtenir une fonctionnalité similaire.

20
Ram

comment autoriser l'ajout de clés en double dans le dictionnaire

Ce n'est pas possible. Toutes les clés doivent être uniques. Comme Dictionary<TKey, TValue> implémenté:

Chaque clé d'unDictionary<TKey, TValue> doit être unique conformément à le comparateur d'égalité du dictionnaire.

Solutions possibles - vous pouvez conserver la collection de chaînes comme valeur (c'est-à-dire utiliser Dictionary<string, List<string>>), ou (mieux) vous pouvez utiliser Lookup<TKey, TValue> au lieu de dictionnaire.


comment vérifier les clés en double et supprimer la valeur précédente de Dictionnaire?

Vérifiez si la clé existe avant d'ajouter une nouvelle entrée:

if (!previousLines.ContainsKey(dialedno))   
     previousLines.Add(dialedno, line); // add new entry
else
     previousLines[dialedno] = line; // update entry value

Vous pouvez également utiliser la requête LINQ pour créer un dictionnaire avec uniquement la dernière valeur pour chaque clé (supposons que vous avez une séquence d'objets avec les propriétés dialedno et line):

var previousLines = sequence.GroupBy(s => s.dialedno)
                            .ToDictionary(g => g.Key, g => g.Last().line);
26
Sergey Berezovskiy

Nous pouvons utiliser une liste de paires de valeurs clés

List<KeyValuePair<string, string>> myduplicateLovingDictionary= new List<KeyValuePair<string, string>>();
KeyValuePair<string,string> myItem = new KeyValuePair<string,string>(dialedno, line);
myduplicateLovingDictionary.Add(myItem);
13
wintersolider

Il n'est pas possible d'ajouter des éléments en double à un dictionnaire - une alternative consiste à utiliser la classe Lookup .

Méthode Enumerable.ToLookup

Crée une recherche générique à partir d'un IEnumerable.

6
Sadique

Exemple:

class Program
        {
             private static List<KeyValuePair<string, int>> d = new List<KeyValuePair<string, int>>();

            static void Main(string[] args)
            {
                 d.Add(new KeyValuePair<string, int>("joe", 100));
                 d.Add(new KeyValuePair<string, int>("joe", 200));
                 d.Add(new KeyValuePair<string, int>("jim", 100));
                 var result = d.Where(x => x.Key == "joe");
                foreach(var q in result)
                    Console.WriteLine(q.Value   );
                Console.ReadLine();
            }
         }
0
user10327722
List< KeyValuePair < string, string>> listKeyValPair= new List< KeyValuePair< string, string>>();
KeyValuePair< string, string> keyValue= new KeyValuePair< string, string>("KEY1", "VALUE1");
listKeyValPair.Add(keyValue);
0
Nagesh Hugar

Si votre question est de savoir si vous pouvez ajouter deux fois la même clé, la réponse est Non . Cependant, si vous souhaitez simplement parcourir l'élément et augmenter le nombre de valeurs de la clé, vous pouvez y parvenir en utilisant Méthode "TryAdd".

var dict = new Dictionary<int, int>();
        foreach (var item in array)
        {
            dict.TryAdd(item, 0);
            dict[item]++;
        }

La même chose que nous essayons de réaliser avec if else peut être réalisée avec cette méthode.

https://docs.Microsoft.com/en-us/dotnet/api/system.collections.concurrent.concurrentdictionary-2.tryadd?view=netframework-4.7.2

0
avinava basu