C# — StringDictionary — как получить ключи и значения с помощью одного цикла?

Я использую коллекцию StringDictionary для сбора пар ключ-значение.

E.g.:

StringDictionary KeyValue = new StringDictionary();
KeyValue.Add("A", "Load");
KeyValue.Add("C", "Save");

Во время поиска я должен сформировать два foreach, чтобы получить ключи и значения (т.е.)

foreach(string key in KeyValue.Values)
{
   ...
}

foreach(string key in KeyValue.Keys)
{
   ...
}

Есть ли способ получить пару в одиночном foreach?


person user160677    schedule 25.08.2009    source источник


Ответы (5)


Вы можете выполнить цикл foreach в словаре, который даст вам DictionaryEntry в каждой итерации. Вы можете получить доступ к Key и Value из этого объекта.

foreach (DictionaryEntry value in KeyValue)
{
    // use value.Key and value.Value
}
person Fredrik Mörk    schedule 25.08.2009
comment
Спасибо, мне нужен был именно этот ответ, повторяя «this.Context.Parameters», который возвращает коллекцию DictionaryEntry. - person Bravo; 27.08.2012
comment
Это идеально подходит для использования с ListDictionary! - person JillAndMe; 16.08.2018
comment
10 лет спустя и несколько вещей, на которые следует обратить внимание: во-первых, value.Key и value.Value возвращаются как объект типа, который для многих случаев использования может потребоваться приведение, даже если тип хранения является StringDictionary Примеры в различных ответах достигают приведение неявно или используйте обычный словарь. Во-вторых, StringDictionary возвращает ключи в нижнем регистре, а обычный Dictionary — нет. Об этом говорится в MS Doco, но это можно не заметить. - person Rob Von Nesselrode; 25.06.2019

StringDictionary может повторяться как DictionaryEntry элементов:

foreach (DictionaryEntry item in KeyValue) {
   Console.WriteLine("{0} = {1}", item.Key, item.Value);
}

Я бы предложил вместо этого использовать более новый класс Dictionary<string,string>:

Dictionary<string, string> KeyValue = new Dictionary<string, string>();
KeyValue.Add("A", "Load");
KeyValue.Add("C", "Save");

foreach (KeyValuePair<string, string> item in KeyValue) {
   Console.WriteLine("{0} = {1}", item.Key, item.Value);
}
person Guffa    schedule 25.08.2009
comment
Конечно. Я изменю его на Dictionary‹string,string› - person user160677; 25.08.2009

Одного должно быть достаточно:

foreach (string key in KeyValue.Keys)
{
  string value = KeyValue[key];

  // Process key/value pair here
}

Или я неправильно понял ваш вопрос?

person Thorsten Dittmar    schedule 25.08.2009
comment
То, что вы понимаете, правильно! Все ответы работают отлично - person user160677; 25.08.2009

У вас уже есть много ответов. Но в зависимости от того, что вы хотите сделать, вы можете использовать LINQ.

Допустим, вы хотите получить список сочетаний клавиш, которые используют клавишу CTRL. Вы можете сделать что-то вроде:

var dict = new Dictionary<string, string>();
dict.Add("Ctrl+A", "Select all");
dict.Add("...", "...");

var ctrlShortcuts =
    dict
        .Where(x => x.Key.StartsWith("Ctrl+"))
        .ToDictionary(x => x.Key, x => x.Value);
person Bruno Reis    schedule 25.08.2009
comment
Вопрос касался использования StringDictionary, а не Dictionary‹string,string›. - person Rafael Rivera; 10.01.2011

Вы можете просто перечислить сам словарь. Он должен возвращать последовательность экземпляров DictionaryEntry.

Лучшей альтернативой является использование Dictionary<string, string>.

person Mark Seemann    schedule 25.08.2009