Nigdy nie otrzymałem żadnego kodu, który próbowałem pracować.Jak uzyskać listę kluczy w słowniku?
Chcę kluczy, a nie wartości (jeszcze). Używanie innej macierzy okazało się zbyt pracochłonne, ponieważ ja też usuwam.
Nigdy nie otrzymałem żadnego kodu, który próbowałem pracować.Jak uzyskać listę kluczy w słowniku?
Chcę kluczy, a nie wartości (jeszcze). Używanie innej macierzy okazało się zbyt pracochłonne, ponieważ ja też usuwam.
List<string> keyList = new List<string>(this.yourDictionary.Keys);
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);
}
A co, jeśli usuwasz klucze w pętli? –
@MartinCapodici to zazwyczaj powinieneś oczekiwać, że iterator złamie się i odmówi kontynuowania –
Marc, tak, w takim przypadku zrobiłbyś coś podobnego do drugiej odpowiedzi i utworzysz nową listę. –
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);
}
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ć.
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);
}
czy tworzy to kopię kluczy? (aby można było bezpiecznie wyliczyć) – mcmillab
myślę, że najbardziej schludny sposobem jest użycie LINQ:
Dictionary<string, int> data = new Dictionary<string, int>();
data.Select(x=>x.Key).ToList();
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. –
Aby listę wszystkich kluczy dostać
List<String> myKeys = myDict.Keys.ToList();
Proszę nie zapomnieć: 'using System.Linq;' Muszę wiedzieć, które odpowiedzi zignorować. Przepraszam :) – Bitterblue
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
nie działa: 'Dictionary
Dla hybrydowego dic tionary używam to:
List<string> keys = new List<string>(dictionary.Count);
keys.AddRange(dictionary.Keys.Cast<string>());
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))
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();
czy konieczne jest użycie "tego". – JerryGoyal
@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