Come posso ottenere l'elenco delle chiavi in ​​un dizionario?


152

Voglio solo le chiavi e non i valori di un dizionario.

Non sono ancora riuscito a ottenere alcun codice per farlo. L'uso di un altro array si è rivelato troppo impegnativo, poiché uso anche remove.

Come posso ottenere un elenco delle chiavi in ​​un dizionario?

Risposte:


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

6
è necessario usare "questo".
JerryGoyal,

15
@JerryGoyal No, non è necessario. Viene semplicemente usato per cancellare la confusione sul fatto che yourDictionaryfaccia parte dell'oggetto, derivato nella funzione o che il nome sia un parametro.
bcdan,

1
Una risposta più completa sarebbe quella di non presumere che il tipo di chiave sia una stringa. var keyList = yourDictionary.Keys.ToList (); O se vuoi impazzire e non usare var o Linq: - Digita keyType = yourDictionary.GetType (). GetGenericArguments () [0]; Digitare listType = typeof (Elenco <>). MakeGenericType (keyType); IList keyList = (IList) Activator.CreateInstance (listType); keyList.AddRange (yourDictionary.Keys);
Antony Booth,

70

Dovresti essere in grado di guardare solo .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
E se si rimuovono le chiavi nel loop?
Martin Capodici,

5
@MartinCapodici, di solito dovresti aspettarti che l'iteratore si rompa e rifiuti di continuare
Marc Gravell

5
Marc, sì, quindi in quel caso faresti qualcosa come l'altra risposta e creeresti un nuovo elenco.
Martin Capodici,

43

Per ottenere l'elenco di tutte le chiavi

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

System.Linq è supportato in .Net framework 3.5 o versioni successive. Vedere i collegamenti seguenti se si riscontrano problemi durante l'utilizzo di System.Linq

Visual Studio non riconosce System.Linq

Spazio dei nomi System.Linq


13
Per favore, non dimenticare: using System.Linq;ho bisogno di sapere quali risposte ignorare. Siamo spiacenti :)
Bitterblue,

2
Grazie @Bitterblue. Non riuscivo a capire perché .ToList()stavo generando un errore quando l'avevo usato tante altre volte, quindi sono venuto qui in cerca di una risposta e mi sono reso conto che il file su cui stavo lavorando non aveva using System.Linq:)
Drew

1
non funziona:Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
Sakra,

non funziona davvero. usa invece la risposta accettata.
Aleck

1
@aleck Funziona benissimo. Potresti non aver usato System.Linq come suggerito da Bitterblue o la versione del framework .Net che stai utilizzando non lo supporta. È stato introdotto in .Net framework 3.5, Vedi questo link . Sto aggiornando la risposta per utilizzare System.Linq prima di utilizzare questo metodo.
prem

12

La risposta di Marc Gravell dovrebbe funzionare per te. myDictionary.Keysrestituisce un oggetto che implementa ICollection<TKey>, IEnumerable<TKey>e le loro controparti non generici.

Volevo solo aggiungere che se prevedi di accedere anche al valore, potresti scorrere il dizionario in questo modo (esempio modificato):

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

La domanda è un po 'complicata da capire, ma immagino che il problema sia che stai cercando di rimuovere elementi dal Dizionario mentre esegui l'iterazione delle chiavi. Penso che in quel caso non hai altra scelta che usare un secondo array.

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

Se è possibile utilizzare elenchi e dizionari generici invece di una ArrayList, lo farei, tuttavia quanto sopra dovrebbe funzionare.


2

Non posso credere a tutte queste risposte contorte. Supponendo che la chiave sia di tipo: stringa (o usa 'var' se sei uno sviluppatore pigro): -

List<string> listOfKeys = theCollection.Keys.ToList();

Cosa vuoi dire che non funziona? Un dizionario ha una proprietà di chiavi di tipo KeyCollection, che implementa ICollection che ha un metodo di estensione ToList <> (). Aggiungi System.Linq alle tue istruzioni "using" e dovresti essere bravo. using System.linq;
Antony Booth,

0

O così:

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

questo crea una copia delle chiavi? (in modo da poter elencare in modo sicuro)
mcmillab

Sta riscrivendo l'estensione .ToList <T> () linq. Inoltre, un elenco di KeyValuePair è un dizionario. La richiesta originale era solo per un elenco di chiavi. L'uso di un ciclo per popolare non è necessario poiché List ha un costruttore che accetta una raccolta e ha anche un metodo AddRange () da aggiungere a un Elenco esistente. Vedi la risposta accettata
Antony Booth,

0

Per un dizionario ibrido, utilizzo questo:

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

-2

L'ho usato spesso per ottenere la chiave e il valore all'interno di un dizionario: (VB.Net)

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

 Next

(layerList è di tipo Dizionario (Of String, Integer))

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.