Wie erhalte ich die Liste der Schlüssel in einem Wörterbuch?

152

Ich möchte nur die Schlüssel und nicht die Werte eines Wörterbuchs.

Ich konnte noch keinen Code dafür bekommen. Die Verwendung eines anderen Arrays erwies sich als zu viel Arbeit, da ich auch remove verwende.

Wie erhalte ich eine Liste der Schlüssel in einem Wörterbuch?

Athiwat Chunlakhan
quelle

Antworten:

305
List<string> keyList = new List<string>(this.yourDictionary.Keys);
Kamale
quelle
6
ist es notwendig, "dies" zu verwenden.
JerryGoyal
15
@ JerryGoyal Nein, das ist nicht nötig. Es wird einfach verwendet, um Verwirrung darüber zu beseitigen, ob yourDictionaryes Teil des Objekts ist, abgeleitet von der Funktion oder dem Namen eines Parameters.
bcdan
1
Eine vollständigere Antwort wäre, nicht anzunehmen, dass der Schlüsseltyp eine Zeichenfolge ist. var keyList = yourDictionary.Keys.ToList (); Oder wenn Sie verrückt werden und nicht var oder Linq verwenden möchten: - Geben Sie keyType = yourDictionary.GetType () ein. GetGenericArguments () [0]; Typ listType = typeof (List <>). MakeGenericType (keyType); IList keyList = (IList) Activator.CreateInstance (listType); keyList.AddRange (yourDictionary.Keys);
Antony Booth
70

Sie sollten in der Lage sein, nur zu betrachten .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);
    }
Marc Gravell
quelle
2
Und was ist, wenn Sie Schlüssel in der Schleife entfernen?
Martin Capodici
5
@MartinCapodici dann sollten Sie normalerweise erwarten, dass der Iterator bricht und sich weigert, fortzufahren
Marc Gravell
5
Marc, ja, in diesem Fall würden Sie so etwas wie die andere Antwort tun und eine neue Liste erstellen.
Martin Capodici
43

Um eine Liste aller Schlüssel zu erhalten

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

System.Linq wird in .NET Framework 3.5 oder höher unterstützt. Siehe die folgenden Links, wenn Sie Probleme bei der Verwendung von System.Linq haben

Visual Studio erkennt System.Linq nicht

System.Linq-Namespace

prem
quelle
13
Bitte nicht vergessen: using System.Linq;Ich muss wissen, welche Antworten zu ignorieren sind. Entschuldigung :)
Bitterblue
2
Danke @Bitterblue. Ich konnte nicht verstehen, warum .ToList()ein Fehler ausgelöst wurde, als ich ihn so oft verwendet hatte, also kam ich hierher, um nach einer Antwort zu suchen, und mir wurde klar, dass die Datei, in der ich arbeitete, keine hatte using System.Linq:)
Drew
1
funktioniert nicht:Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
Sakra
funktioniert in der Tat nicht. Verwenden Sie stattdessen die akzeptierte Antwort.
Aleck
1
@aleck Es funktioniert super. Möglicherweise haben Sie System.Linq nicht verwendet, wie von Bitterblue vorgeschlagen, oder die von Ihnen verwendete .Net-Framework-Version unterstützt dies nicht. Es wurde in .NET Framework 3.5 eingeführt. Siehe diesen Link . Ich aktualisiere die Antwort, um System.Linq zu verwenden, bevor ich diese Methode verwende.
Prem
12

Marc Gravells Antwort sollte für Sie funktionieren. myDictionary.Keysgibt ein Objekt , dass Geräte ICollection<TKey>, IEnumerable<TKey>und ihre nicht-generische Pendants.

Ich wollte nur hinzufügen, dass Sie, wenn Sie auch auf den Wert zugreifen möchten, das Wörterbuch wie folgt durchlaufen können (modifiziertes Beispiel):

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);
}
Thorarin
quelle
3

Die Frage ist etwas schwierig zu verstehen, aber ich vermute, dass das Problem darin besteht, dass Sie versuchen, Elemente aus dem Wörterbuch zu entfernen, während Sie über die Schlüssel iterieren. Ich denke, in diesem Fall haben Sie keine andere Wahl, als ein zweites Array zu verwenden.

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

Wenn Sie generische Listen und Wörterbücher anstelle einer ArrayList verwenden können, würde ich, aber das oben Genannte sollte einfach funktionieren.

Dan
quelle
2

Ich kann all diese verschlungenen Antworten nicht glauben. Angenommen, der Schlüssel ist vom Typ: string (oder verwenden Sie 'var', wenn Sie ein fauler Entwickler sind): -

List<string> listOfKeys = theCollection.Keys.ToList();
Antony Booth
quelle
Was meinst du damit, dass es nicht funktioniert? Ein Wörterbuch hat eine Eigenschaft von Schlüsseln vom Typ KeyCollection, die ICollection mit einer ToList <> () -Erweiterungsmethode implementiert. Fügen Sie System.Linq zu Ihren 'using'-Anweisungen hinzu, und Sie sollten gut sein. using System.linq;
Antony Booth
0

Oder so:

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);
}
etw
quelle
Erstellt dies eine Kopie der Schlüssel? (damit Sie sicher aufzählen können)
mcmillab
Damit wird die Linq-Erweiterung .ToList <T> () neu geschrieben. Eine Liste von KeyValuePair ist auch ein Wörterbuch. Die ursprüngliche Anfrage betraf nur eine Liste der Schlüssel. Das Auffüllen einer Schleife ist nicht erforderlich, da List über einen Konstruktor verfügt, der eine Auflistung übernimmt, und über eine AddRange () -Methode, die einer vorhandenen Liste hinzugefügt werden kann. Siehe die akzeptierte Antwort.
Antony Booth
0

Für ein Hybridwörterbuch verwende ich Folgendes:

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

Ich habe dies oft verwendet, um den Schlüssel und den Wert in einem Wörterbuch abzurufen: (VB.Net)

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

 Next

(layerList ist vom Typ Dictionary (Of String, Integer))

Joseph Wu
quelle