Como obtenho a lista de chaves em um dicionário?

152

Eu só quero as chaves e não os valores de um dicionário.

Ainda não consegui obter nenhum código para fazer isso. Usar outra matriz provou ser muito trabalhoso, pois eu também uso o remove.

Como obtenho uma lista de chaves em um dicionário?

Athiwat Chunlakhan
fonte

Respostas:

305
List<string> keyList = new List<string>(this.yourDictionary.Keys);
Camal
fonte
6
é necessário usar "isso".
precisa saber é o seguinte
15
@JerryGoyal Não, não é necessário. É simplesmente usado para limpar a confusão sobre se yourDictionaryfaz parte do objeto, derivado na função ou no nome de um parâmetro.
Bcdan #
1
Uma resposta mais completa seria não assumir que o tipo de chave seja uma sequência. var keyList = yourDictionary.Keys.ToList (); Ou se você quiser enlouquecer e não usar var ou Linq: - Digite keyType = yourDictionary.GetType (). GetGenericArguments () [0]; Digite listType = typeof (List <>). MakeGenericType (keyType); IList keyList = (IList) Activator.CreateInstance (listType); keyList.AddRange (yourDictionary.Keys);
Antony Booth
70

Você deve conseguir apenas olhar para .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
fonte
2
E se você estiver removendo chaves no loop?
Martin Capodici 10/03/16
5
@MartinCapodici então você deve geralmente esperar o iterador para quebrar e se recusam a continuar
Marc Gravell
5
Marc, sim, nesse caso, você faria algo como a outra resposta e criaria uma nova lista.
Martin Capodici
43

Para obter a lista de todas as chaves

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

O System.Linq é suportado no .Net framework 3.5 ou superior. Consulte os links abaixo se você tiver algum problema ao usar o System.Linq

Visual Studio não reconhece System.Linq

Espaço para nome System.Linq

prem
fonte
13
Por favor, não esqueça: using System.Linq;eu preciso saber quais respostas ignorar. Desculpe :)
Bitterblue 06/06
2
Obrigado @Bitterblue. Eu não conseguia entender por que .ToList()estava jogando um erro quando eu tinha usado tantas outras vezes, então eu vim aqui à procura de uma resposta e eu percebi o arquivo que eu estava trabalhando em não ter using System.Linq:)
de Drew
1
não funciona:Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
sakra
não funciona de fato. use a resposta aceita.
aleck
1
@aleck Funciona muito bem. Você pode não ter usado o System.Linq, conforme sugerido pela versão do framework Bitterblue ou .Net que você está usando, não o suporta. Foi introduzido no .Net framework 3.5, consulte este link . Estou atualizando a resposta para usar o System.Linq antes de usar este método.
prem
12

A resposta de Marc Gravell deve funcionar para você. myDictionary.Keysdevolve um objecto que implementa ICollection<TKey>, IEnumerable<TKey>e os seus homólogos não-genéricos.

Eu só queria acrescentar que se você planeja acessar o valor também, pode percorrer o dicionário como este (exemplo 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
fonte
3

A pergunta é um pouco difícil de entender, mas acho que o problema é que você está tentando remover elementos do Dicionário enquanto itera sobre as teclas. Acho que nesse caso você não tem escolha a não ser usar uma segunda matriz.

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

Se você pode usar listas e dicionários genéricos em vez de um ArrayList, eu usaria, no entanto, o acima deve funcionar.

Dan
fonte
2

Não acredito em todas essas respostas complicadas. Supondo que a chave seja do tipo: string (ou use 'var' se você for um desenvolvedor preguiçoso): -

List<string> listOfKeys = theCollection.Keys.ToList();
Antony Booth
fonte
Como assim, não funciona? Um dicionário possui uma propriedade de chaves do tipo KeyCollection, que implementa ICollection que possui um método de extensão ToList <> (). Adicione System.Linq às suas instruções 'using' e você deve ser bom. using System.linq;
Tony Booth
0

Ou assim:

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);
}
sth
fonte
isso cria uma cópia das chaves? (para que você possa enumerar com segurança)
mcmillab 20/12/12
Isso está reescrevendo a extensão linq .ToList <T> (). Além disso, uma lista de KeyValuePair é um dicionário. A solicitação original era apenas para uma lista de chaves. Usar um loop para preencher é desnecessário, pois List possui um construtor que coleta uma coleção e também possui um método AddRange () para adicionar a uma lista existente. Veja a resposta aceita.
Antony Booth
0

Para um dicionário híbrido, eu uso este:

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

Eu costumava usar isso para obter a chave e o valor dentro de um dicionário: (VB.Net)

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

 Next

(layerList é do tipo Dictionary (Of String, Integer))

Joseph Wu
fonte