2013-01-23 4 views
20

Ich bin eine Zeichenfolge und Int-Wert in Schlüsselwertpaar speichern.Suchen bereits vorhandenen Wert in Schlüssel Wertpaar

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

Beim Hinzufügen ich brauche, wenn string (Key), die bereits in der Liste vorhanden ist, um zu überprüfen, ob ich es hinzufügen muß existiert neue Schlüssel anstatt auf Wertschöpfung.
Wie überprüfen und hinzufügen?

+10

Also warum benutzen Sie nicht ein 'Dictionary' dann? – leppie

+2

Beachten Sie, dass 'KeyValuePair ' unveränderlich ist. Sie müssten den vorhandenen Eintrag entfernen und jedes Mal einen neuen erstellen, wenn Sie den Wert aktualisieren möchten. Deshalb ist ein 'Wörterbuch' viel besser als in den Antworten angegeben. – mellamokb

+2

Danke, ich gehe mit Wörterbuch. – Olivarsham

Antwort

28

Statt Liste Sie Dictionary verwenden und überprüfen, ob es contains key dann den neuen Wert in den bestehenden Schlüssel

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

Nur eine Anmerkung: Dictionary erlaubt keinen Zugriff per Index. Wenn das eine Voraussetzung ist (wie in meinem Fall), dann ist dies keine praktikable Lösung. – Dan

+1

@Dan, 'Dictionary' erlaubt den Zugriff per Index, wie' dictionary ["myKey"] 'Ich bin mir nicht sicher, was du meintest. – Habib

+4

Auf der anderen Seite unterstützt das Dictionary nicht dieselben Schlüssel mit unterschiedlichen Werten. – SSpoke

4

Ihre Anforderungen beschreiben genau das Design von 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

Map ist ein sehr Javaish Wort; p – leppie

+0

@leppie yup, reparierte es, ich bin mehr von einer C++/Java-Welt .. –

+0

C# Entsprechung von Maps? – Olivarsham

7

Verwenden Sie das Diktat. Dictionary in C# und ich schlage vor, Sie diesen Beitrag zu lesen 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); 

zu überprüfen. verwenden ContainsKey ContainsKey

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

Wenn Sie die Liste verwenden müssen, müssen Sie die Liste foreach und suche nach den Schlüsseln. Einfach können Sie Hashtable verwenden.

4

Sicher ist Wörterbuch in Ihrem Fall vorzuziehen. Sie können den Wert von KeyValue<string,int> Klasse nicht ändern, wie es unveränderlich ist.

Aber auch wenn Sie immer noch List<KeyValuePair<string, int>>(); verwenden möchten. Sie können IEqualityComparer<KeyValuePair<string, int>> verwenden. Code wird wie sein.

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

und verwenden Sie es in Enthält wie

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 
     } 

, die nicht gute Weise nicht klingt.

hoffe diese info hilft ..