2010-03-29 6 views
12

나는 클래스로 Dictionary<int, MyType>을 사용하고 있습니다. 이 클래스는 IList<MyType>이 반환되어야하는 인터페이스를 구현합니다. 하나를 다른 것으로 캐스팅하는 간단한 방법이 있습니까 (전체를 복사하지 않고)?사전 <MyType> .ValueCollection을 IList로 변환 <MyType>

내 현재 솔루션은 다음과 같습니다

private IList<MyType> ConvertToList(Dictionary<int, MyType>.ValueCollection valueCollection) 
{ 
    List<MyType> list = new List<MyType>(); 
    list.AddRange(valueCollection); 
    return list; 
} 
+0

지금까지 게시 된 모든 솔루션에는 전체 컬렉션이 복사됩니다. ** 질문 **을 읽어보십시오. – SLaks

+0

@SLaks : 나는이 대답을 직접적으로 언급했다 ... (여전히 복사를 포함한다) –

+0

keyType "int"와 관련이 있는가, 아니면 임의의 타입인가? –

답변

20

복사본을 만들어야하지만 이것은 좋은 방법 일 것입니다. C# 2에서 현재 코드는 사용자가 만들 수있는 가장 깨끗한 코드입니다. 직접 값 (List<MyType> list = new List<MyType>(valueCollection);)에서 목록을 작성하면 개선되지만 사본은 여전히 ​​필요합니다. C# 3과 LINQ를 사용

, 그러나, 당신은 할 수있을 것입니다 :

말했다되고 그건
myDictionary.Values.ToList(); 

, 나는 (아마도) 사본을 피하려고하지 않을 것입니다. 콜렉션을 수정하려고하면 발신자가 문제를 일으키지 않으므로 값의 복사본을 반환하는 것이 더 안전합니다. 복사본을 반송하면 발신자가 클래스 문제를 일으키지 않고 list.Add(...) 또는 list.Remove(...)을 수행 할 수 있습니다.


편집 : 당신이 원하는 모든이 백작과 IEnumerable<T>, 당신은 단지 ICollection<T>을 반환 할 경우, 아래에 코멘트를 감안할 때. 이 직접 그냥 아무 복사하여, 직접 사전의 값을 반환 할 수 있습니다 의미 ValueCollection에 의해 구현됩니다

private ICollection<MyType> ConvertToList(Dictionary<int, MyType>.ValueCollection valueCollection) 
{ 
    return valueCollection; 
} 

은 (설령,이 방법은이 경우 정말 쓸모가된다 - 그러나 나는 그것을 증명하고 싶었다 너 ...)

+0

@Slaks : 다음 문장 : "직접 값 목록을 만들 수 있습니다.";) ICollection 이기 때문에 더 좋지 않습니다. (카운트는 미리 알고 있기 때문에) 더 효율적입니다. –

+0

@Slaks : 그게 뭐야? 나는 그것을 더 명백하게했다. –

+0

훌륭한 답변 주셔서 감사합니다. ICollection 인터페이스는 내 요구 사항을 완벽하게 충족시킵니다. –

0
생성자 사용할 수 있습니다

: (. 나는 확실히 100 % 아니에요 주장을 제거하기 위해 수정 됨)

public IList<MyType> MyValues 
{ 
    get { return new List<MyType>(myDictionary.Values); } 
} 

+0

여전히 컬렉션 복사본을 만듭니다. – mcNux

4

어떻게 약

Dictionary<int, MyType> dlist = new Dictionary<int, MyType>(); 
IList<MyType> list = new List<MyType>(dlist.Values); 
+2

여전히 컬렉션을 복사합니다. – SLaks

2

이것은 불가능합니다.

사전 (해당 Values 컬렉션 포함)은 본질적으로 순서가 지정되지 않은 모음입니다. 그 순서는 키의 해시 코드에 근거 해 변경됩니다. 이것이 ValueCollection이 처음에는 IList<T>을 구현하지 않는 이유입니다. 당신이 정말로가 원 경우

, 당신은 IList를 구현하고 인덱서에서 foreach 루프를 사용하여 ValueCollection를 감싸는 래퍼 클래스를 만들 수 있습니다. 그러나 그것은 좋은 생각이 아닙니다.

+0

@SLaks 나는 명령에 대해 까다 롭지 않다. 내가 원하는 건 IEnumerable이다. 더 나은 인터페이스가 있다면 알려주세요. –

+0

@C. 로스 : 내 편집을보고, 그 다음에 ... –

관련 문제