2013-01-23 11 views
20

Przechowuję ciąg znaków i wartość int w parach Klucza wartości.Znajdowanie już istniejącej wartości w parze Wartość klucza

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

Podczas dodawania muszę sprawdzić, czy ciąg (klucz) już istnieje na liście, jeśli istnieje i trzeba go dodać do wartości zamiast dodawania nowego klucza.
Jak sprawdzić i dodać?

+10

Dlaczego więc nie używasz 'Słownika'? – leppie

+2

Pamiętaj, że 'KeyValuePair ' jest niezmienne. Musisz usunąć istniejący wpis i utworzyć nowy za każdym razem, gdy chcesz zaktualizować wartość. Dlatego "słownik" jest znacznie lepszy niż podano w odpowiedziach. – mellamokb

+2

Dzięki, idę ze Słownikiem. – Olivarsham

Odpowiedz

28

Zamiast listy można użyć Dictionary i sprawdzić, czy to contains key następnie dodać nową wartość do istniejącego klucza

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

Po prostu Uwaga: słownik nie zezwala na dostęp przez indeks. Jeśli jest to wymagane (tak jak w moim przypadku), nie jest to realistyczne rozwiązanie. – Dan

+1

@Dan, 'Słownik' pozwala na dostęp poprzez indeks, np.' Dictionary ["myKey"] 'Nie jestem pewien, co miałeś na myśli. – Habib

+4

Ale z drugiej strony Słownik nie obsługuje tych samych kluczy o różnych wartościach. – SSpoke

4

Twoje potrzeby dokładnie opisują projekt 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

Mapa jest bardzo nowatorskim słowem; p – leppie

+0

@leppie yup, naprawiono, jestem bardziej ze świata C++/Java .. –

+0

C# ekwiwalent map? – Olivarsham

7

użyć dyktonarium. Dictionary in C# i Proponuję przeczytać ten 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); 

do sprawdzenia. używać containsKey ContainsKey

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

Jeśli musisz skorzystać z listy, trzeba foreach listy i poszukaj kluczy. Najłatwiej, możesz użyć hashtable.

4

Na pewno w twoim przypadku preferowany jest słownik. Nie można modyfikować klasy Wartość KeyValue<string,int>, ponieważ jest niezmienna.

Ale nawet jeśli nadal chcesz używać List<KeyValuePair<string, int>>();. Możesz użyć IEqualityComparer<KeyValuePair<string, int>>. Kod będzie podobny.

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

i używać go w Zawiera jak

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 
     } 

który nie brzmi dobry sposób.

nadzieję, że ta informacja pomoże ..

Powiązane problemy