Я сделал Словарь<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);
}
}
}
Вы не можете. И ваш вопрос предполагает вашу уверенность в том, что Dictionary
является упорядоченным списком. Нет. Если вам нужен упорядоченный словарь, этот тип не для вас.
Возможно, OrderedDictionary - ваш друг. Он обеспечивает целочисленную индексацию.
Вы не можете. Как уже было сказано - словарь не имеет порядка.
Сделайте свой собственный контейнер, который раскрывает IList
и IDictionary
... и внутренне управляет обоими (списком и словарем). Это то, что я делаю в таких случаях. Итак, я могу использовать оба метода.
В основном
class MyOwnContainer : IList, IDictionary
и затем внутренне
IList _list = xxx
IDictionary _dictionary = xxx
затем при добавлении / удалении / изменении... обновить оба.
Нельзя: индекс не имеет смысла, потому что словарь не упорядочен, а порядок возврата элементов при перечислении может меняться по мере добавления и удаления элементов. Для этого нужно скопировать элементы в список.
Словарь
не сортируется/упорядочивается, поэтому номера индексов будут бессмысленны.
Для этого можно использовать класс KeyedCollection
в пространстве имен System.Collections.ObjectModel
. Есть только одна ошибка: это абстрактно. Так что вам придется унаследовать от него и создать свой собственный :-). В противном случае используйте неуниверсальный класс OrderedDictionary
.