2013-04-16 3 views
2

У меня есть функция, которая возвращает IDictionary<TKey, List<TValue> >.
У меня есть другая функция, которая принимает IDictionary<TKey, IEnumerable<TValue> >.Как конвертировать IDictionary <TKey, List <TValue>> в IDictionary <TKey, IEnumerable <TValue>>?

Мне нужно передать возврат первой функции ко второй функции.
Компилятор не хочет, чтобы implicitlty конвертировал первый во второй. Итак, как я мог преобразовать первую во вторую в O (1)?

я всегда мог бы написать функцию преобразования

public static IDictionary<TKey, IEnumerable<TValue>> ToIEnumerable<TKey, TValue>(this IDictionary<TKey, List<TValue>> source) 
{ 
    return source.ToDictionary(s => s.Key, s => s.Value.AsEnumerable()); 
} 

Но я уверен, что это не O (1), больше как O (журнал N).

Смежный вопрос здесь: Nested Interfaces: Cast IDictionary< TKey, IList< TValue > > to IDictionary< TKey, IEnumerable < TValue> >?

+0

Просто любопытно, для чего вы хотите это сделать? –

+0

Ум, позвонишь мне на вторую функцию, не теряя времени, делая конверсию, которая кажется не нужна! –

+1

Если вы хотите O (1). Просто напишите обертку вокруг нее. Я не вижу проблемы, хотя 'List ' уже 'IEnumerable '. Где конверсия? – leppie

ответ

1

Рассмотрим вашу вторую функцию, тот, который

takes a IDictionary<TKey, IEnumerable<TValue> > 

Теперь, если вы дадите мне IDictionary<TKey, IEnumerable<TValue>>, одна из вещей, которые я должен быть в состоянии сделать, это установить значение одного из ключей к new TValue[], правильно? В конце концов, TValue[] является IEnumerable<TValue>, поэтому он соответствует ограничению.

Однако, если как-то, что бы ты дал мне был (под интерфейс) в IDictionary<TKey, List<TValue>>, я определенно не должно быть разрешено установить значение ключа к TValue[], так как TValue[] не List<TValue> !

Это, безусловно, проблема в вопросе, который вы связали, конечно.

Теперь, если вы счастливы только когда-либо прочитать параметр я передаю вам, у вас есть потенциальное решение в переходе от словарей ILookup<TKey, TValue>, который немного похож на только для чтения словаря из ключа a значений. Если ваши методы соответственно возвращают и принимают ILookup<TKey, TValue>, то, конечно, проблем нет.

+0

ILookup - отличное решение. Жаль, что он не поддерживает пустой список. –

+0

@ Scorpi0 - это проблема, учитывая, что при поиске ключа [«Если ключ не найден в коллекции, возвращается пустая последовательность»] (http://msdn.microsoft.com/en-us /library/bb292716.aspx)? – AakashM

+0

Не совсем. У меня есть логика, основанная на ключах, присутствующих в словаре. Поэтому, если ключ не существует, ну, я не могу его легко получить. Боковой вопрос: я не могу установить фреймворк 4.5, но есть [ReadOnlyDictionary] (http://msdn.microsoft.com/en-us/library/gg712875.aspx) может сделать трюк? Я не могу это проверить. –