Як отримати список клавіш у словнику?


152

Я хочу лише клавіші, а не значення словника.

Я ще не зміг отримати жодного коду для цього. Використання іншого масиву виявилося занадто великою роботою, тому що я використовую також видалити.

Як отримати список ключів у словнику?

Відповіді:


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

6
чи потрібно використовувати "це".
JerryGoyal

15
@JerryGoyal Ні, це не потрібно. Він просто використовується для очищення плутанини з приводу того, yourDictionaryє частиною об'єкта, похідною у функції або іменем параметра.
bcdan

1
Повнішою відповіддю було б не припускати, що тип Key є рядком. var keyList = yourDictionary.Keys.ToList (); Або якщо ви хочете збитися, а не використовувати var або Linq: - введіть keyType = yourDictionary.GetType (). GetGenericArguments () [0]; Тип listType = typeof (Список <>). MakeGenericType (keyType); IList keyList = (IList) Activator.CreateInstance (listType); keyList.AddRange (yourDictionary.Keys);
Ентоні Бут

70

Ви повинні мати можливість просто подивитися .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
А що робити, якщо ви виймаєте ключі в циклі?
Мартін Каподічі

5
@MartinCapodici тоді зазвичай слід очікувати, що ітератор зламається і відмовляється продовжувати
Марк Гравелл

5
Марк, так, у такому випадку ти зробиш щось подібне до іншої відповіді та створиш новий список.
Мартін Каподічі

43

Щоб отримати список усіх клавіш

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

System.Linq підтримується в .Net Framework 3.5 або вище. Перегляньте посилання нижче, якщо у вас виникли проблеми з використанням System.Linq

Visual Studio не розпізнає System.Linq

System.Linq Простір імен


13
Будь ласка, не забувайте: using System.Linq;мені потрібно знати, які відповіді ігнорувати. Вибачте :)
Bitterblue

2
Дякую @Bitterblue Я не міг зрозуміти, чому .ToList()кидав помилку, коли я користувався нею стільки разів, тому я прийшов сюди шукати відповідь і зрозумів, що файл, в якому я працював, не мав using System.Linq:)
Дрю

1
не працює:Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
sakra

насправді не працює. використовуйте натомість прийняту відповідь.
aleck

1
@aleck Це чудово працює. Можливо, ви не використовували System.Linq, як пропонує Bitterblue або .Net рамкова версія, яку ви використовуєте, не підтримує його. Він був представлений у .Net Framework 3.5. Див. Це посилання . Я оновлюю відповідь, щоб використовувати System.Linq, перш ніж використовувати цей метод.
прем.

12

Відповідь Марка Гравелла має працювати для вас. myDictionary.Keysповертає об'єкт, який реалізує ICollection<TKey>, IEnumerable<TKey>та їх негенеричні аналоги.

Я просто хотів додати, що якщо ви також плануєте отримати доступ до значення, ви можете переглядати такий словник (модифікований приклад):

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

Питання трохи складне для розуміння, але я здогадуюсь, що проблема полягає в тому, що ви намагаєтесь видалити елементи зі словника, переглядаючи клавіші. Я думаю, що в цьому випадку у вас немає іншого вибору, як використовувати другий масив.

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

Якщо ви можете використовувати загальні списки та словники замість ArrayList, я б, однак, вищезазначене повинно просто працювати.


2

Я не можу повірити на всі ці суперечливі відповіді. Припустимо, що тип має тип: string (або використовуйте "var", якщо ви лінивий розробник): -

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

Що ти означає, що це не працює? Словник має властивість ключів типу KeyCollection, що реалізує ICollection, який має метод розширення ToList <> (). Додайте System.Linq до ваших висловлювань про "використання", і ви повинні бути хорошими. using System.linq;
Ентоні Бут

0

Або так:

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

це створює копію ключів? (щоб ви могли сміливо перерахувати)
mcmillab

Це перезапис розширення .ToList <T> (). Також список KeyValuePair - це словник. Початковий запит був лише для списку ключів. Використання циклу для заповнення не є зайвим, оскільки у списку є конструктор, який бере колекцію, а також метод AddRange () для додавання до вже наявного списку. Дивіться прийняту відповідь.
Ентоні Бут

0

Для гібридного словника я використовую це:

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

-2

Я часто використовував це, щоб отримати ключ і значення всередині словника: (VB.Net)

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

 Next

(layerList має словник типу (String, Integer))

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.