2013-02-20 24 views
9

Próbuję umieścić wartości w słowniku zależnie od klucza ... Na przykład, jeśli na liście kluczy w indeksie 0 znajduje się litera "a". Chcę dodać wartość val z indeksem 0 do listy wewnątrz słownika za pomocą klawisza "a" (słownik (klucz to "a" w indeksie 0, val w indeksie 0) ... słownik (klucz to "b" w indeks 2, val w indeksie 2))Dodawanie pozycji do listy w słowniku

Czekam wyjście takiego:

w listview LV1: 1,2,4 w listview LV2: 3,5

co ja otrzymuję jest 3,4,5 zarówno listviews

List<string> key = new List<string>(); 
List<long> val = new List<long>(); 
List<long> tempList = new List<long>(); 
Dictionary<string, List<long>> testList = new Dictionary<string, List<long>>(); 

key.Add("a"); 
key.Add("a"); 
key.Add("b"); 
key.Add("a"); 
key.Add("b"); 
val.Add(1); 
val.Add(2); 
val.Add(3); 
val.Add(4); 
val.Add(5);  

for (int index = 0; index < 5; index++) 
{ 

    if (testList.ContainsKey(key[index])) 
    { 
     testList[key[index]].Add(val[index]); 
    } 
    else 
    { 
     tempList.Clear(); 
     tempList.Add(val[index]); 
     testList.Add(key[index], tempList); 
    } 
}  
lv1.ItemsSource = testList["a"]; 
lv2.ItemsSource = testList["b"]; 

Rozwiązanie:

zastąpić moduł kodu innego z:

testList.Add (element [indeks], nową listę {Val [indeks]});

thx wszystkim za pomoc =)

+0

im dodanie klucza tylko wtedy, gdy nie istnieje ... if (testList.ContainsKey (klawisz [indeks])) .... – user2093348

+0

Czyścisz 'tempList', gdy dojdziesz do klawisza [3], ponieważ" b "nie znajduje się jeszcze w liście testowej.W efekcie otrzymasz 'tempList' zawierający {3,4,5}; wartość dla obu elementów w słowniku jest odniesieniem do tego samego obiektu. – sigil

Odpowiedz

9

Używasz tej samej listy dla obu kluczy w Słowniku

for (int index = 0; index < 5; index++) 
    { 
     if (testList.ContainsKey(key[index])) 
     { 
      testList[k].Add(val[index]); 
     } 
     else 
     { 
      testList.Add(key[index], new List<long>{val[index]}); 
     } 
    } 

Wystarczy utworzyć jedną nową listę (Long), gdy klucz nie istnieje, następnie dodać długa wartość to

+0

thx bardzo ... to rozwiązało to =) – user2093348

1

Brzmi jak zadanie domowe, ale

for (int index = 0; index < 5; index++) 
{ 
    if (!testList.ContainsKey(key[index])) 
     testList.Add(key[index], new List<string> {value[index]}); 
    else 
     testList[key[index]].Add(value[index]); 
} 

Czytaj this (oraz inne istotne tutoriale)

+1

Czy jesteś pewien, że to zadziała? Jeśli pozycja z 'key [index]' nie istnieje w słowniku, 'testList [key [index]]' ma wartość 'null', co powoduje' NullReferenceException'. –

+0

Tak, nie przeczytałem tego, zmodyfikowałem. –

1

Wymienić jeszcze z:

else 
{ 
    tempList.Clear(); 
    tempList.Add(val[index]); 
    testList.Add(key[index], new List<long>(tempList)); 
} 

Problem polega na tym, że dodajesz odwołanie do TempList do oba klucze, to jest to samo odniesienie, więc zostanie zastąpione w pierwszym.

tworzę nową listę, więc nie zostanie zastąpiona: new List<long>(tempList)

1

Pozbyć się tempList i zastąpić klauzulę else z:

testList.Add(key[index], new List<long> { val[index] }); 

i nie używać Contains. TryGetValue jest znacznie lepiej:

for (int index = 0; index < 5; index++) 
{ 
    int k = key[index]; 
    int v = val[index]; 
    List<long> items; 
    if (testList.TryGetValue(k, out items)) 
    { 
     items.Add(v); 
    } 
    else 
    { 
     testList.Add(k, new List<long> { v }); 
    } 
} 
0

Nie jestem całkowicie pewien, co próbujesz zrobić tutaj, ale gwarantuję, że nie chcesz tej samej listy w każdym wpisie słownikowym.

templist jest Twój problem wymiany templist.Clear() dla templist = new List<Long>()

Albo pójść na

for (int index = 0; index < 5; index++) 
{ 
if (!testList.ContainsKey(key[Index])) 
{ 
testList.Add(key[Index], new List<Long>()); 
} 
testList[key[index]].Add(val[index]); 
} 
Powiązane problemy