¿Cómo obtengo la lista de claves en un diccionario?

152

Solo quiero las claves y no los valores de un diccionario.

No he podido obtener ningún código para hacer esto todavía. Usar otra matriz demostró ser demasiado trabajo ya que también uso remove.

¿Cómo obtengo una lista de las claves en un diccionario?

Athiwat Chunlakhan
fuente

Respuestas:

305
List<string> keyList = new List<string>(this.yourDictionary.Keys);
Camal
fuente
66
¿Es necesario usar "esto"?
JerryGoyal
15
@JerryGoyal No, no es necesario. Simplemente se usa para aclarar la confusión acerca de si yourDictionaryes parte del objeto, derivado de la función o del nombre de un parámetro.
bcdan
1
Una respuesta más completa sería no asumir que el tipo de clave es una cadena. var keyList = yourDictionary.Keys.ToList (); O si desea volverse loco y no usar var o Linq: - Escriba keyType = yourDictionary.GetType (). GetGenericArguments () [0]; Escriba listType = typeof (List <>). MakeGenericType (keyType); IList keyList = (IList) Activator.CreateInstance (listType); keyList.AddRange (yourDictionary.Keys);
Antony Booth
70

Deberías poder simplemente mirar .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
fuente
2
¿Y qué pasa si está eliminando claves en el bucle?
Martin Capodici
55
@MartinCapodici, por lo general, debe esperar que el iterador se rompa y se niegue a continuar
Marc Gravell
55
Marc, sí, en ese caso harías algo como la otra respuesta y crearías una nueva lista.
Martin Capodici
43

Para obtener una lista de todas las claves

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

System.Linq es compatible con .Net Framework 3.5 o superior. Consulte los enlaces a continuación si tiene algún problema al usar System.Linq

Visual Studio no reconoce System.Linq

System.Linq Namespace

prem
fuente
13
Por favor no olvides: 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 aquí buscando una respuesta y me di cuenta de que el archivo en el que estaba trabajando no tenía using System.Linq:)
Drew
1
no funciona:Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
sakra
no funciona de hecho. use la respuesta aceptada en su lugar.
aleck
1
@aleck Funciona muy bien. Es posible que no haya utilizado System.Linq como lo sugiere Bitterblue o la versión de .Net framework que está utilizando no lo admite. Fue introducido en .Net framework 3.5, consulte este enlace . Estoy actualizando la respuesta para usar System.Linq antes de usar este método.
prem
12

La respuesta de Marc Gravell debería funcionar para usted. myDictionary.Keysdevuelve un objeto que implementa ICollection<TKey>, IEnumerable<TKey>y sus homólogos no genéricos.

Solo quería agregar que si también planea acceder al valor, podría recorrer el diccionario de esta manera (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);
}
Thorarin
fuente
3

La pregunta es un poco difícil de entender, pero 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 una ArrayList, lo haría, sin embargo, lo anterior debería funcionar.

Dan
fuente
2

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

List<string> listOfKeys = theCollection.Keys.ToList();
Cabina de antony
fuente
¿Qué quieres decir con que no funciona? Un diccionario tiene una propiedad de claves del tipo KeyCollection, que implementa ICollection que tiene un método de extensión ToList <> (). Agregue System.Linq a sus declaraciones de 'uso' y debería ser bueno. using System.linq;
Antony Booth
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);
}
algo
fuente
¿Esto crea una copia de las claves? (para que pueda enumerar de forma segura)
mcmillab
Eso está reescribiendo la extensión .qT (<T> () linq. Además, una lista de KeyValuePair es un diccionario. La solicitud original era solo para una lista de claves. El uso de un bucle para rellenar es innecesario ya que List tiene un constructor que toma una colección y también tiene un método AddRange () para agregar a una lista existente. Ver la respuesta aceptada.
Antony Booth
0

Para un diccionario híbrido, uso esto:

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

A menudo usé 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 del tipo Dictionary (Of String, Integer))

Joseph Wu
fuente