Comment obtenir la liste des clés dans un dictionnaire?

153

Je ne veux que les clés et non les valeurs d'un dictionnaire.

Je n'ai pas encore pu obtenir de code pour le faire. Utiliser un autre tableau s'est avéré être trop de travail car j'utilise également remove.

Comment obtenir une liste des clés d'un dictionnaire?

Athiwat Chunlakhan
la source

Réponses:

305
List<string> keyList = new List<string>(this.yourDictionary.Keys);
Camal
la source
6
est-il nécessaire d'utiliser «ceci».
JerryGoyal
15
@JerryGoyal Non, ce n'est pas nécessaire. Il est simplement utilisé pour dissiper la confusion quant à savoir si yourDictionaryfait partie de l'objet, dérivé dans la fonction ou le nom d'un paramètre.
bcdan
1
Une réponse plus complète serait de ne pas supposer que le type de clé est une chaîne. var keyList = votreDictionary.Keys.ToList (); Ou si vous voulez devenir fou et ne pas utiliser var ou Linq: - Tapez keyType = yourDictionary.GetType (). GetGenericArguments () [0]; Tapez listType = typeof (List <>). MakeGenericType (keyType); IList keyList = (IList) Activator.CreateInstance (listType); keyList.AddRange (yourDictionary.Keys);
Antony Booth
70

Vous devriez pouvoir simplement regarder .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
la source
2
Et si vous supprimez des clés de la boucle?
Martin Capodici
5
@MartinCapodici alors vous devriez généralement vous attendre à ce que l'itérateur se brise et refuse de continuer
Marc Gravell
5
Marc, oui donc dans ce cas vous feriez quelque chose comme l'autre réponse et créeriez une nouvelle liste.
Martin Capodici
43

Pour obtenir la liste de toutes les clés

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

System.Linq est pris en charge dans .Net Framework 3.5 ou supérieur. Consultez les liens ci-dessous si vous rencontrez un problème lors de l'utilisation de System.Linq

Visual Studio ne reconnaît pas System.Linq

Espace de noms System.Linq

prem
la source
13
N'oubliez pas: using System.Linq;j'ai besoin de savoir quelles réponses ignorer. Désolé :)
Bitterblue
2
Merci @Bitterblue. Je ne comprenais pas pourquoi .ToList()jette une erreur alors que je l'avais utilisé tant d'autres fois, alors je suis venu ici pour chercher une réponse et j'ai réalisé que le fichier dans lequel je travaillais n'avait pas using System.Linq:)
Drew
1
ne fonctionne pas:Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
sakra
ne fonctionne pas en effet. utilisez plutôt la réponse acceptée.
aleck
1
@aleck Cela fonctionne très bien. Vous n'avez peut-être pas utilisé System.Linq comme suggéré par Bitterblue ou la version du framework .Net que vous utilisez ne le prend pas en charge. Il a été introduit dans .Net Framework 3.5, voir ce lien . Je mets à jour la réponse pour utiliser System.Linq avant d'utiliser cette méthode.
prem
12

La réponse de Marc Gravell devrait fonctionner pour vous. myDictionary.Keysretourne un objet qui implémente ICollection<TKey>, IEnumerable<TKey>et leurs homologues non génériques.

Je voulais juste ajouter que si vous prévoyez également d'accéder à la valeur, vous pouvez parcourir le dictionnaire comme ceci (exemple modifié):

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
la source
3

La question est un peu délicate à comprendre, mais je suppose que le problème est que vous essayez de supprimer des éléments du dictionnaire pendant que vous parcourez les clés. Je pense que dans ce cas, vous n'avez pas d'autre choix que d'utiliser un deuxième tableau.

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

Si vous pouvez utiliser des listes et des dictionnaires génériques au lieu d'une ArrayList, je le ferais, mais ce qui précède devrait simplement fonctionner.

Dan
la source
2

Je ne peux pas croire toutes ces réponses alambiquées. En supposant que la clé est de type: string (ou utilisez 'var' si vous êtes un développeur paresseux): -

List<string> listOfKeys = theCollection.Keys.ToList();
Antony Booth
la source
Que voulez-vous dire que ça ne marche pas? Un dictionnaire a une propriété de clés de type KeyCollection, qui implémente ICollection qui a une méthode d'extension ToList <> (). Ajoutez System.Linq à vos instructions «using» et vous devriez être bon. using System.linq;
Antony Booth
0

Ou comme ça:

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);
}
qc
la source
cela crée-t-il une copie des clés? (afin que vous puissiez énumérer en toute sécurité)
mcmillab
C'est la réécriture de l'extension linq .ToList <T> (). En outre, une liste de KeyValuePair est un dictionnaire. La demande initiale concernait uniquement une liste de clés. L'utilisation d'une boucle pour remplir n'est pas nécessaire car List a un constructeur qui prend une collection et a également une méthode AddRange () à ajouter à une List existante. Voir la réponse acceptée.
Antony Booth
0

Pour un dictionnaire hybride, j'utilise ceci:

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

J'ai souvent utilisé ceci pour obtenir la clé et la valeur dans un dictionnaire: (VB.Net)

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

 Next

(layerList est de type Dictionary (Of String, Integer))

Joseph Wu
la source