2009-08-14 16 views

Odpowiedz

220
List<string> keyList = new List<string>(this.yourDictionary.Keys); 
+4

czy konieczne jest użycie "tego". – JerryGoyal

+8

@JerryGoyal Nie, to nie jest konieczne. Używa się go po prostu do wyjaśnienia, czy 'twójDictionary' jest częścią obiektu, wywodzi się z funkcji lub nazywa parametr. – bcdan

64

Powinieneś być w stanie po prostu spojrzeć na .Keys:

Dictionary<string, int> data = new Dictionary<string, int>(); 
    data.Add("abc", 123); 
    data.Add("def", 456); 
    foreach (string key in data.Keys) 
    { 
     Console.WriteLine(key); 
    } 
+1

A co, jeśli usuwasz klucze w pętli? –

+4

@MartinCapodici to zazwyczaj powinieneś oczekiwać, że iterator złamie się i odmówi kontynuowania –

+2

Marc, tak, w takim przypadku zrobiłbyś coś podobnego do drugiej odpowiedzi i utworzysz nową listę. –

11

odpowiedź Marc Gravell powinien pracować dla Ciebie. myDictionary.Keys zwraca obiekt, który implementuje ICollection<TKey>, IEnumerable<TKey> i ich nietypowe odpowiedniki.

Chciałem tylko dodać, że jeśli plan dostępu wartość jak dobrze, można pętli słownika tak (zmodyfikowany przykład):

Dictionary<string, int> data = new Dictionary<string, int>(); 
data.Add("abc", 123); 
data.Add("def", 456); 

foreach (KeyValuePair<string, int> item in data) 
{ 
    Console.WriteLine(item.Key + ": " + item.Value); 
} 
3

pytanie jest trochę trudne do zrozumienia, ale ja Domyślam się, że problem polega na tym, że próbujesz usunąć elementy ze Słownika podczas iteracji kluczy. Myślę, że w tym przypadku nie masz innego wyboru, jak użyć drugiej tablicy.

ArrayList lList = new ArrayList(lDict.Keys); 
foreach (object lKey in lList) 
{ 
    if (<your condition here>) 
    { 
    lDict.Remove(lKey); 
    } 
} 

Jeśli można użyć rodzajowe list i słowniki zamiast ArrayList to bym jednak powyższe należy po prostu działać.

0

Albo tak:

List< KeyValuePair< string, int > > theList = 
    new List< KeyValuePair< string,int > >(this.yourDictionary); 

for (int i = 0; i < theList.Count; i++) 
{ 
    // the key 
    Console.WriteLine(theList[i].Key); 
} 
+0

czy tworzy to kopię kluczy? (aby można było bezpiecznie wyliczyć) – mcmillab

1

myślę, że najbardziej schludny sposobem jest użycie LINQ:

Dictionary<string, int> data = new Dictionary<string, int>(); data.Select(x=>x.Key).ToList();

+1

To może być "czysty" sposób, ale jest to również bardzo drogi sposób. Po pierwsze, podczas gdy dane.Klucze byłyby operacją O (1) i tak naprawdę nie przydzieliłyby niczego, twoje rozwiązanie byłoby O (N) i przydzieliłoby nową kolekcję (listę) ze wszystkimi kluczami. Więc proszę, nie rób tego. –

30

Aby listę wszystkich kluczy dostać

List<String> myKeys = myDict.Keys.ToList(); 
+7

Proszę nie zapomnieć: 'using System.Linq;' Muszę wiedzieć, które odpowiedzi zignorować. Przepraszam :) – Bitterblue

+2

Dziękuję @Bitterblue. Nie mogłem zrozumieć, dlaczego '.ToList()' popełnił błąd, gdy użyłem go tak wiele razy, więc przyszedłem tutaj szukając odpowiedzi i zdałem sobie sprawę, że plik, w którym pracowałem, nie miał 'używania Systemu .Linq' :) – Drew

+0

nie działa: 'Dictionary .KeyCollection 'nie zawiera definicji" ToList "' – sakra

0

Dla hybrydowego dic tionary używam to:

List<string> keys = new List<string>(dictionary.Count); 
keys.AddRange(dictionary.Keys.Cast<string>()); 
-2

często używane to aby dostać klucz i wartość wewnątrz słownika: (VB.Net)

For Each kv As KeyValuePair(Of String, Integer) In layerList 

Next 

(layerList jest typu Dictionary (String, Integer))

0

Nie mogę uwierzyć we wszystkie te zawiłe odpowiedzi. Zakładając, że klucz jest typu: string (lub użyj "var", jeśli jesteś leniwym programistą): -

List<string> listOfKeys = theCollection.Keys.ToList(); 
Powiązane problemy