C #, коллекция, которая содержит списки другого типа - PullRequest
4 голосов
/ 21 сентября 2011

В настоящее время у меня есть класс, который содержит 3 словаря, каждый из которых содержит списки одного типа в каждом словаре, но разные типы по словарям, такие как:

Dictionary1<string, List<int>> ... Dictionary2<string, List<double>>... Dictionary3<string, List<DateTime>>...

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

Я хочу иметь возможность получить доступ к списку напрямую через строку или другой идентификатор и получить доступ к членам списка. Безопасность типов не является обязательным требованием, но взамен я не хочу ничего разыгрывать, скорость здесь является абсолютным приоритетом.

Таким образом, когда вычисления выполняются для членов списка, предполагается знание точного типа, например "double lastValue = MasterCollection [" List1 "]. Last ();", тогда как предполагается, что List1 является списком Тип двойной.

Можно ли это сделать? Извините, что я могу иногда использовать неверную или неполную терминологию. Я не являюсь опытным программистом или разработчиком.

Спасибо, Matt

Ответы [ 2 ]

3 голосов
/ 21 сентября 2011

Для этого вам придется использовать неуниверсальный API, такой как IList (не IList<T>) - т.е. Dictionary<string, IList>.Или, поскольку вам просто нужно выполнить итерацию, может быть, просто IEnumerable (не IEnumerable<T>).Тем не мение!Это будет означать, что вы говорите не универсально, поэтому могут потребоваться некоторые жертвы (упаковка типов значений во время поиска и т. Д.).

С аппроксимацией IList / IEnumerable, чтобы настроить ваш пример:

double lastValue = MasterCollection["List1"].Cast<double>().Last();

Конечно, вы можете написать несколько пользовательских методов расширения для IDictionary<string,IList>, допускающих что-то вроде:

double lastValue = MasterCollection.Get<double>("List1").Last();

Я не уверен, что оно того стоит, хотя.

0 голосов
/ 21 сентября 2011

Нет, то, что вы пытаетесь сделать, невозможно; а именно, требование строгой типизации во всех списках без приведения - вот что мешает остальным.

Если ваше единственное требование - перебирать каждый из элементов в списке, то вы можете создать свой словарь как Dictionary<string, IEnumerable> (обратите внимание на неуниверсальный интерфейс). IEnumerable<T> происходит от IEnumerable, что позволит вам перебирать каждый элемент в списке.

Проблема в том, что в какой-то момент вам придется выполнить приведение к IEnumerable<T> (при условии, что вы знаете, что вы работаете с ним) или использовать метод расширения Cast<T> на Enumerable класс (последний хуже, так как вы можете подвергнуться боксу / распаковке, если только он не производит перехват типов, в этом случае у вас не будет штрафа за производительность).

Я бы сказал, что вы не должны хранить элементы в одном списке; ваш пример использования показывает, что вы знаете тип заранее (вы присваиваете значение типа double), так что вы знаете на тот момент конкретный типизированный список.

Не стоит терять безопасность типов.

...