Jak uzyskać listę kluczy w słowniku?


152

Chcę tylko kluczy, a nie wartości słownika.

Nie udało mi się jeszcze uzyskać żadnego kodu, aby to zrobić. Używanie innej tablicy okazało się zbyt pracochłonne, ponieważ używam również remove.

Jak uzyskać listę kluczy w słowniku?

Odpowiedzi:


305
List<string> keyList = new List<string>(this.yourDictionary.Keys);

6
czy konieczne jest użycie „tego”.
JerryGoyal

15
@JerryGoyal Nie, nie jest to konieczne. Służy po prostu do usunięcia nieporozumień dotyczących tego, czy yourDictionaryjest częścią obiektu, wyprowadzoną z funkcji, czy też nazwą parametru.
bcdan

1
Bardziej kompletną odpowiedzią byłoby nie zakładanie, że typ klucza jest łańcuchem. var keyList = yourDictionary.Keys.ToList (); Lub jeśli chcesz oszaleć i nie używać var ​​ani Linq: - Wpisz keyType = yourDictionary.GetType (). GetGenericArguments () [0]; Wpisz listType = typeof (List <>). MakeGenericType (keyType); IList keyList = (IList) Activator.CreateInstance (listType); keyList.AddRange (yourDictionary.Keys);
Antony Booth

70

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

2
A co jeśli usuwasz klucze w pętli?
Martin Capodici

5
@MartinCapodici to zwykle powinieneś spodziewać się, że iterator się zepsuje i odmówi kontynuowania
Marc Gravell

5
Marc, tak, więc w takim przypadku zrobiłbyś coś podobnego do drugiej odpowiedzi i utworzył nową listę.
Martin Capodici

43

Aby uzyskać listę wszystkich kluczy

using System.Linq;
List<String> myKeys = myDict.Keys.ToList();

System.Linq jest obsługiwany w .Net Framework 3.5 lub nowszym. Zobacz poniższe linki, jeśli napotkasz jakiekolwiek problemy w korzystaniu z System.Linq

Program Visual Studio nie rozpoznaje System.Linq

Przestrzeń nazw System.Linq


13
Nie zapomnij: using System.Linq;muszę wiedzieć, które odpowiedzi zignorować. Przepraszam :)
Bitterblue

2
Dziękuję @Bitterblue. Nie mogłem zrozumieć, dlaczego .ToList()wyrzucałem błąd, kiedy użyłem go tyle razy, więc przyszedłem tutaj, szukając odpowiedzi i zdałem sobie sprawę, że plik, w którym pracowałem, nie ma using System.Linq:)
Drew

1
nie działa:Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
sakra

rzeczywiście nie działa. użyj zamiast tego zaakceptowanej odpowiedzi.
aleck

1
@aleck Działa świetnie. Możliwe, że nie korzystałeś z System.Linq, jak sugeruje Bitterblue lub .Net wersja, której używasz, nie obsługuje go. Został wprowadzony w .Net framework 3.5, Zobacz ten link . Aktualizuję odpowiedź, aby użyć System.Linq przed użyciem tej metody.
prem

12

Odpowiedź Marca Gravella powinna ci pasować. myDictionary.Keyszwraca obiekt, który implementuje ICollection<TKey>, IEnumerable<TKey>i ich nieogólne odpowiedniki.

Chciałem tylko dodać, że jeśli planujesz również uzyskać dostęp do wartości, możesz zapętlić słownik w następujący sposób (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 domyślam się, że problem polega na tym, że próbujesz usunąć elementy ze słownika podczas iteracji po kluczach. Myślę, że w takim przypadku nie masz innego wyjścia, jak tylko 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żesz użyć ogólnych list i słowników zamiast ArrayList, to zrobiłbym to, jednak powyższe powinno po prostu działać.


2

Nie mogę uwierzyć w te wszystkie 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();

Co masz na myśli mówiąc, że to nie działa? Dictionary ma właściwość kluczy typu KeyCollection, która implementuje ICollection, która ma metodę rozszerzenia ToList <> (). Dodaj System.Linq do swoich instrukcji „using” i powinieneś być dobry. using System.linq;
Antony Booth

0

Lub 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 to tworzy kopię kluczy? (żebyś mógł bezpiecznie wyliczyć)
mcmillab

To jest przepisanie rozszerzenia linq .ToList <T> (). Ponadto lista KeyValuePair jest słownikiem. Pierwotna prośba dotyczyła tylko listy kluczy. Używanie pętli do wypełniania nie jest konieczne, ponieważ List ma konstruktora, który pobiera kolekcję, a także ma metodę AddRange (), którą można dodać do istniejącej listy. Zobacz zaakceptowaną odpowiedź.
Antony Booth

0

W przypadku słownika hybrydowego używam tego:

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

-2

Często używałem tego, aby uzyskać klucz i wartość w słowniku: (VB.Net)

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

 Next

(LayerList jest typu Dictionary (Of String, Integer))

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.