2009-08-14 9 views

risposta

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

è necessario utilizzare "questo". – JerryGoyal

+8

@JerryGoyal No, non è necessario. Viene semplicemente usato per chiarire la confusione se 'yourDictionary' fa parte dell'oggetto, derivato nella funzione o il nome di un parametro. – bcdan

64

Si dovrebbe essere in grado di guardare solo al .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

E se si rimuovono le chiavi nel ciclo? –

+4

@MartinCapodici quindi di solito dovresti aspettarti che l'iteratore si interrompa e rifiuti di continuare –

+2

Marc, sì, in tal caso faresti qualcosa come l'altra risposta e creare una nuova lista. –

11

risposta di Marc Gravell dovrebbe funzionare per voi. myDictionary.Keys restituisce un oggetto che implementa ICollection<TKey>, IEnumerable<TKey> e le loro controparti non generiche.

Volevo solo aggiungere che, se si ha intenzione di accedere al valore così, si potrebbe ciclo attraverso il dizionario come questo (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 questione è un po 'difficile da capire, ma io Suppongo che il problema sia che stai cercando di rimuovere elementi dal dizionario mentre esegui un'iterazione sui tasti. Penso che in questo 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 gli elenchi generici e dizionari, invece di un ArrayList quindi vorrei, però quanto sopra dovrebbe funzionare.

0

O come questa:

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

crea una copia delle chiavi? (in modo che sia possibile enumerare in modo sicuro) – mcmillab

1

Penso che il modo più pulito è quello di utilizzare LINQ:

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

+1

Questo potrebbe essere "pulito", ma è anche un modo molto costoso. In primo luogo, mentre i dati.Le chiavi sarebbero operazioni O (1) e non assegnerebbero nulla, la soluzione sarebbe O (N) e assegnerebbe una nuova raccolta (elenco) con tutte le chiavi. Quindi, per favore, non farlo. –

30

ottenere l'elenco di tutte le chiavi

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

Si prega di non dimenticare: 'using System.Linq;' Ho bisogno di sapere quali risposte ignorare. Scusa :) – Bitterblue

+2

Grazie @Bitterblue. Non riuscivo a capire perché '.ToList()' stesse generando un errore quando l'avevo usato tante altre volte, quindi sono venuto qui cercando una risposta e ho capito che il file su cui stavo lavorando non aveva 'using System .Linq' :) – Drew

+0

non funziona: 'Dictionary .KeyCollection 'non contiene una definizione per' ToList'' – sakra

0

Per un ibrido dic nale, io uso questo:

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

Ho spesso usato questo 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 

(lista dei livelli è di tipo Dictionary (Of String, Integer))

0

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

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