2013-04-16 3 views
2

IDictionary<TKey, List<TValue> >을 반환하는 함수가 있습니다.
IDictionary<TKey, IEnumerable<TValue> >을 사용하는 다른 함수가 있습니다.IDictionary <TKey, IEnumerable <TValue>>에 IDictionary <TKey, List <TValue>>을 변환하는 방법?

첫 번째 함수의 반환을 두 번째 함수에 전달해야합니다.
컴파일러는 첫 번째를 두 번째로 암시 적으로 변환하지 않으려합니다. 어떻게 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()); 
} 

을 쓸 수 있었다 그러나 나는이 (1) 더 많은 O와 같은 (로그 n) O되지 않습니다 확신 해요. 여기

이와 관련된 질문 : Nested Interfaces: Cast IDictionary< TKey, IList< TValue > > to IDictionary< TKey, IEnumerable < TValue> >?

+0

궁금한 점이 무엇인가요? –

+0

흠, 필요하지 않은 것으로 보이는 전환을 수행하여 시간을 낭비하지 않고 두 번째 기능을 호출 할 수 있습니다! –

+1

O (1)을 원할 경우. 그냥 주위에 래퍼를 작성하십시오. 'List '는 이미'IEnumerable '이긴하지만 그 문제는 보지 못합니다. 전환은 어디에 있습니까? – leppie

답변

1

당신이 나에게 내가 할 수 있어야 것들의 IDictionary<TKey, IEnumerable<TValue>>, 하나를 주면 설정, 두 번째 기능, 하나의 지금

takes a IDictionary<TKey, IEnumerable<TValue> > 

을 고려 키 중 하나의 값은 new TValue[], 맞습니까? 결국 TValue[]IEnumerable<TValue>이므로 제약 조건을 충족합니다. 당신이 제공했던 것을 어떻게 든 경우

그러나 나는 IDictionary<TKey, List<TValue>> (인터페이스 아래)이었고, 나는 확실히 TValue[]List<TValue>하지 않습니다 때문에, 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)가이 트릭을 수행 할 수 있습니까? 나는 그것을 시험 할 수 없다. –

관련 문제