2009-08-14 12 views

Respuesta

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

es necesario usar "esto". – JerryGoyal

+8

@JerryGoyal No, no es necesario. Simplemente se usa para aclarar la confusión acerca de si 'yourDictionary' es parte del objeto, se deriva en la función o el nombre es un parámetro. – bcdan

64

Usted debe ser capaz de tan sólo mirar a .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

¿Y qué pasa si está eliminando claves en el bucle? –

+4

@MartinCapodici, entonces normalmente debería esperar que el iterador se rompa y se niegue a continuar –

+2

Marc, sí, entonces en ese caso haría algo como la otra respuesta y crearía una nueva lista. –

11

la respuesta de Marc Gravell debe trabajar para usted. myDictionary.Keys devuelve un objeto que implementa ICollection<TKey>, IEnumerable<TKey> y sus homólogos no genéricos.

Sólo quería añadir que si usted planea acceder al valor, así, usted podría navegar por el diccionario como esto (ejemplo modificado):

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 pregunta es un poco difícil de entender, pero me Supongo que el problema es que estás tratando de eliminar elementos del Diccionario mientras iteras sobre las teclas. Creo que en ese caso no tienes más remedio que usar una segunda matriz.

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

Si puede usar listas genéricas y diccionarios en lugar de un ArrayList entonces yo, sin embargo, lo anterior sólo debería trabajar.

0

O así:

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

¿esto crea una copia de las claves? (para que pueda enumerar con seguridad) – mcmillab

1

creo que la manera más ordenada es utilizar LINQ:

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

+1

Esto podría ser una forma "ordenada" pero también es una forma muy costosa. Primero, mientras que los datos.Las claves serían O (1) operación y realmente no asignarían nada, su solución sería O (N) y asignaría una nueva colección (lista) con todas las claves. Entonces, por favor, no hagas esto. –

30

Para obtener la lista de todas las claves

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

No olvide: 'using System.Linq;' Necesito saber qué respuestas ignorar. Lo siento :) – Bitterblue

+2

Gracias @Bitterblue. No podía entender por qué '.ToList()' estaba arrojando un error cuando lo había usado tantas otras veces, así que vine a buscar una respuesta y me di cuenta de que el archivo en el que estaba trabajando no tenía 'using System .Linq' :) – Drew

+0

no funciona: 'Dictionary .KeyCollection 'no contiene una definición para' ToList'' – sakra

0

Para un dic híbrido cionario, yo uso esto:

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

menudo he utilizado esto para obtener la clave y el valor dentro de un diccionario: (VB.Net)

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

Next 

(layerList es de tipo diccionario (de cadena, entero))

0

No puedo creer todas estas respuestas intrincadas. Asumiendo que la clave es de tipo: cadena (o use 'var' si usted es un desarrollador flojo): -

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