web-dev-qa-db-fra.com

Recherche d'une valeur déjà existante dans une paire de valeurs clés

Je stocke une chaîne et une valeur int dans une paire de valeurs clés.

var list = new List<KeyValuePair<string, int>>();

Lors de l'ajout, je dois vérifier si la chaîne (Key) existe déjà dans la liste, si elle existe, je dois l'ajouter à Value au lieu d'ajouter une nouvelle clé.
Comment vérifier et ajouter?

21
Olivarsham

Au lieu de List, vous pouvez utiliser Dictionary et vérifier si elle contient la clé puis ajouter la nouvelle valeur à la clé existante

int newValue = 10;
Dictionary<string, int> dictionary = new Dictionary<string, int>();
if (dictionary.ContainsKey("key"))
    dictionary["key"] = dictionary["key"] + newValue;
30
Habib

utilise le dictionnaire. Dictionnaire en C # et je vous suggère de lire cet article Dictionnaire en .net

Dictionary<string, int> dictionary =
        new Dictionary<string, int>();
    dictionary.Add("cat", 2);
    dictionary.Add("dog", 1);
    dictionary.Add("llama", 0);
    dictionary.Add("iguana", -1);

vérifier. utiliser ContainsKey ContainsKey

if (dictionary.ContainsKey("key"))
    dictionary["key"] = dictionary["key"] + yourValue;
7
Ravi Gadag

Si vous avez besoin d'utiliser la liste, vous devez foreach la liste et rechercher les clés. Simplement, vous pouvez utiliser la table de hachage.

5
Jhonny

Pour sûr, le dictionnaire est préférable dans votre cas. Vous ne pouvez pas modifier la valeur de la classe KeyValue<string,int> Car elle est immuable.

Mais même si vous souhaitez toujours utiliser List<KeyValuePair<string, int>>();. Vous pouvez utiliser IEqualityComparer<KeyValuePair<string, int>>. Le code sera comme.

public class KeyComparer : IEqualityComparer<KeyValuePair<string, int>>
{

    public bool Equals(KeyValuePair<string, int> x, KeyValuePair<string, int> y)
    {
        return x.Key.Equals(y.Key);
    }

    public int GetHashCode(KeyValuePair<string, int> obj)
    {
        return obj.Key.GetHashCode();
    }
}

Et l'utiliser dans Contient comme

var list = new List<KeyValuePair<string, int>>();
        string checkKey = "my string";
        if (list.Contains(new KeyValuePair<string, int>(checkKey, int.MinValue), new KeyComparer()))
        {
            KeyValuePair<string, int> item = list.Find((lItem) => lItem.Key.Equals(checkKey));
            list.Remove(item);
            list.Add(new KeyValuePair<string, int>("checkKey", int.MinValue));// add new value
        }

ce qui ne sonne pas bien.

j'espère que cette info aide ..

4
D J

Vos besoins décrivent exactement la conception de Dictionary s?

Dictionary<string, string> openWith = 
        new Dictionary<string, string>();

// Add some elements to the dictionary. There are no  
// duplicate keys, but some of the values are duplicates.
openWith.Add("txt", "notepad.exe");

// If a key does not exist, setting the indexer for that key 
// adds a new key/value pair.
openWith["doc"] = "winword.exe";
4
Karthik T

Pour quiconque doit utiliser une liste (ce qui était le cas pour moi, car il ne fait pas les choses que Dictionary ne fait pas), vous pouvez simplement utiliser une expression lambda pour voir si la liste contient la clé:

list.Any(l => l.Key == checkForKey);
1
WATYF