С# Преобразование IDictionary в два IList

Мне нужно создать IList с ключами и еще один IList со значениями, взятыми из IDictionary. Как мне это сделать? Мне пришлось избегать обобщений (List‹> и Dictionary‹>), потому что типы внутри них являются определяемыми пользователем типами, неизвестными во время компиляции.

У меня есть метод, который обрабатывает DataTable и возвращает словарь. Тип ключей словаря определяется во время выполнения:

DataTable myDataTable = ....
Type dictionaryKeysType=Type.GetType("myType");
IDictionary myDictionary = ProcessDataTable (myDataTable, dictionaryKeysType);
IList keys= (IList)myDictionary.Keys;
IList values= (IList)myDictionary.Values;

Как мне это сделать? Мне пришлось избегать обобщений (List‹> и Dictionary‹>), потому что типы внутри них являются определяемыми пользователем типами, неизвестными во время компиляции. Итак, хотя метод возвращает «Словарь‹>», я не могу объявить:

Dictionary<dictionaryKeysType, int> myDictionary = ProcessDataTable (myDataTable, dictionaryKeysType)

поэтому я должен получить его как «IDictionary». Использование «var» не является решением, так как проблема возникнет позже при попытке перевести его в «Словарь».

Мой код компилируется, но вызывает исключение при преобразовании в IList. Например, если «myType» равен «uint», я получаю: (Невозможно преобразовать объект типа «KeyCollection [System.UInt32, System.Int32]» в тип «System.Collections.IList»).

Пожалуйста помоги :(


person Kaikus    schedule 13.10.2013    source источник
comment
dic.Keys.ToList(); в сочетании с d.Values.ToList(); должно создать для вас два параллельных списка.   -  person User 12345678    schedule 13.10.2013
comment
Извините :( Это был мой первый выбор, но ICollection IDictionary не реализует .ToList().   -  person Kaikus    schedule 13.10.2013


Ответы (1)


Я бы предложил;

IList keys = myDictionary.Keys.ToList();
IList values = myDictionary.Values.ToList();

Пожалуйста, убедитесь, что вы включили:

using System.Linq;

в верхней части вашего файла.

Это даст вам доступ к методу расширения .ToList().

person Baldrick    schedule 13.10.2013
comment
Извините :( Это был мой первый выбор, но ICollection IDictionary не реализует .ToList(). - person Kaikus; 14.10.2013
comment
Само по себе это не так, но метод расширения в System.Linq предоставляет метод .ToList(), который будет делать то, что вы хотите. Смотрите отредактированный пост выше. - person Baldrick; 14.10.2013
comment
Я не знаю почему, но не делает. Я использую Линк. У меня есть метод «private Dictionary‹T,int›foo(){}», и я получаю данные в «IDictionary myDict = foo‹T›()» (я должен это сделать, потому что я не знаю тип T во время компиляции и я использую «MakeGenericMethod» и «Invoke»). 'myDict.Keys' не реализует 'ToList()' :( - person Kaikus; 21.10.2013