¿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?

Respuestas:


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

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

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


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

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.


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

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

¿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>());

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.