2009-04-21 3 views
3

내가있는 경우 :IDictionary 값을 .Net 2.0의 IList 개체로 복사하는 방법은 무엇입니까?

Dictionary<string, int> 

어떻게이에 모든 값을 복사합니까 :

List<int> 

개체?

솔루션은 2.0 CLR 버전 및 C# 2.0과 호환 될 수 있어야합니다. 사전을 반복하고 List 개체에 값을 하나씩 추가하는 것 외에는 더 좋은 아이디어가 없습니다. . 그러나 이것은 매우 비효율적이라고 느낍니다.

더 좋은 방법이 있습니까?

답변

8

무작위 색인 액세스가있는 목록에 저장된 항목이 정말로 필요한지 또는 때때로 각 키 또는 값을 수시로 열거해야하는지 물어볼 필요가 있습니다.

MyDictionary.Values의 ICollection을 쉽게 반복 할 수 있습니다.

foreach (int item in dict.Values) { dosomething(item); } 

그렇지 않으면 실제로 IList로 저장해야하는 경우 모든 항목을 복사하는 데 특히 비효율적 인 것은 없습니다. 그것은 단지 O (n) 작업입니다. 자주 그렇게 할 필요가 없다면, 왜 걱정해야합니까? 당신이 사용하는 작업을 수행 할 코드를 작성하여 짜증하는 경우 : 당신은 이미 당신이 쓸 계획하고 있었다 코드를 구현하는 복사 생성자로 써서 코드를 래핑

IList<int> x=new List<int>(dict.Values); 

. 이것은 코드 효율성이 뛰어나서 실제로 신경 써야 할 부분입니다. 그것은 당신이 쓰는 것보다 더 많은 시간과 공간을 필요로하지 않습니다.

1

당신은 다음

Dictionary<string,int> map = GetTheDictionary(); 
List<int> values = Util.CopyValues(map); 
+0

IIRC C# 2.0에서는 genric 유형을 추론 할 수 없으므로 호출 할 때이를 지정해야합니다. Util.CopyValues ​​ (map) – Guffa

+1

@Guffa, 내 코드는 C# 2.0 이상에서 작동합니다. C#에서는 2.0에서 로컬 형식 유추를 수행 할 수 없지만 여전히 메서드 형식 유추를 수행 할 수 있습니다. – JaredPar

5

이도 2.0에서 작동해야 같은 방법을 사용할 수 있습니다

public static class Util { 
    public List<TValue> CopyValues<TKey,TValue>(Dictionary<TKey,TValue> map) { 
    return new List<TValue>(map.Values); 
    } 
} 

다음은 ("VAR"의 C# 3.0 사용을 용서) 시도 :

var dict = new Dictionary<string, int>(); 
var list = new List<int>(dict.Values); 
0

List<int> 대신 IEnumerable<int> 또는 ICollection<int>을 사용할 수있는 경우 st 아무것도 복사하지 않고 사전에서 Value 컬렉션을 사용하십시오.

List<int>이 필요한 경우 모든 항목을 복사해야합니다. 목록의 생성자는 작업을 수행 할 수 있지만 각 항목은 여전히 ​​복사해야합니다. 그 주위에는 방법이 없습니다.

관련 문제