Как обращаться к элементам в словаре <string, string> по индексу integer?

Я создал коллекцию Dictionary <string, string>, чтобы я мог быстро ссылаться на элементы с помощью строкового идентификатора.

Но теперь мне также нужно получить доступ к этому коллективу с помощью счетчика индексов (foreach не будет работать в моем реальном примере).

Что мне нужно сделать для коллекции ниже, чтобы я мог получить доступ к своим элементам с помощью целочисленного индекса?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestDict92929
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, string> events = new Dictionary<string, string>();

            events.Add("first", "this is the first one");
            events.Add("second", "this is the second one");
            events.Add("third", "this is the third one");

            string description = events["second"];
            Console.WriteLine(description);

            string description = events[1]; //error
            Console.WriteLine(description);
        }
    }
}

Ответ 1

Вы не можете. И ваш вопрос свидетельствует о том, что Dictionary<TKey, TValue> - упорядоченный список. Это не. Если вам нужен упорядоченный словарь, этот тип не для вас.

Возможно, OrderedDictionary является вашим другом. Он обеспечивает целочисленную индексацию.

Ответ 2

Вы не можете. Как уже было сказано, словарь не имеет порядка.

Сделайте свой СОБСТВЕННЫЙ КОНТЕЙНЕР, который предоставляет IList и IDictionary... и внутренне управляет обоими (список и словарь). Это то, что я делаю в этих случаях. Таким образом, я могу использовать оба метода.

В принципе

class MyOwnContainer : IList, IDictionary

а затем внутренне

IList _list = xxx
IDictionary _dictionary = xxx

то в add/remove/change... обновите оба.

Ответ 3

Для этого можно использовать класс KeyedCollection<TKey, TItem> в пространстве имен System.Collections.ObjectModel. Там только один получил: он абстрактный. Поэтому вам придется унаследовать его и создать свой собственный:-). В противном случае используйте не общий тип OrderedDictionary.

Ответ 4

Вы не можете: индекс не имеет смысла, потому что словарь не упорядочен - и порядок, в котором элементы возвращаются, когда перечисление может измениться при добавлении и удалении элементов. Вам нужно скопировать элементы в список, чтобы сделать это.

Ответ 5

Dictionary не сортируется/упорядочивается, поэтому номера индексов будут бессмысленными.