2013-01-23 21 views
20

Sto memorizzando una stringa e un valore int in coppia di valori chiave.Ricerca di valore già esistente nella coppia di valori chiave

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

Mentre l'aggiunta ho bisogno di controllare se la stringa (Key) esiste già nella lista, se è presente ho bisogno di aggiungerlo al valore invece di aggiungere nuova chiave.
Come controllare e aggiungere?

+10

Allora perché non usi un dizionario? – leppie

+2

Si noti che 'KeyValuePair ' è immutabile. Dovresti rimuovere la voce esistente e crearne una nuova ogni volta che desideri aggiornare il valore. Ecco perché un 'dizionario' è molto meglio dato nelle risposte. – mellamokb

+2

Grazie, vado con il dizionario. – Olivarsham

risposta

28

Invece di List è possibile utilizzare Dictionary e verificare se contains key quindi aggiungere il nuovo valore a quello esistente chiave

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

Solo una nota: Dizionario non consente l'accesso per indice. Se questo è un requisito (come nel mio caso), allora questa non è una soluzione praticabile. – Dan

+1

@Dan, 'Dictionary' consente l'accesso per indice, come' dictionary ["myKey"] 'Non sono sicuro di cosa intendessi. – Habib

+4

Ma d'altra parte il dizionario non supporta le stesse chiavi con valori diversi. – SSpoke

4

Le vostre esigenze descrivono esattamente il design di 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"; 
+1

La mappa è una parola molto Java; p – leppie

+0

@leppie yup, risolto, sono più di un mondo C++/Java .. –

+0

equivalente C# di Maps? – Olivarsham

7

uso dictonary. Dictionary in C# e io suggerisco di leggere questo post Dictonary in .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); 

da controllare. utilizzare ContainsKey ContainsKey

if (dictionary.ContainsKey("key")) 
    dictionary["key"] = dictionary["key"] + yourValue; 
5

Se è necessario utilizzare l'elenco, è necessario foreach la lista e cerca le chiavi. In modo semplice, è possibile utilizzare la tabella hash.

4

Di sicuro, il dizionario è preferibile nel tuo caso. Non è possibile modificare il valore della classe KeyValue<string,int> in quanto è immutabile.

Ma anche se si desidera utilizzare ancora List<KeyValuePair<string, int>>();. È possibile utilizzare IEqualityComparer<KeyValuePair<string, int>>. Il codice sarà come

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(); 
    } 
} 

e utilizzarlo in Contiene come

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 
     } 

che non suona bene così.

sperare che questa informazione sia d'aiuto ..

Problemi correlati