2013-03-28 6 views
1

[질문 : 당신은 간결하면서도 성능이 좋은 방법으로 Dictionary<string, string>OrderedDictionary 변환하려면 어떻게더 나은 방법 <문자열, 문자열>

?

상황 :

나는 그 날이 Dictionary<string, string>을 통과 할 것으로 예상 만지지 수있는 lib 디렉토리가 있습니다. OrderedDictionary을 구축하고 싶습니다. 왜냐하면 주문이 코드의 일부분에서 매우 중요하기 때문입니다. 그래서 저는 OrderedDictionary으로 일하고 있습니다. lib를 때릴 때가되면 Dictionary<string, string>으로 변환해야합니다. 내가 지금까지 시도 무엇

은 :

var dict = new Dictionary<string, string>(); 
var enumerator = MyOrderedDictionary.GetEnumerator(); 
while (enumerator.MoveNext()) 
{ 
    dict.Add(enumerator.Key as string, enumerator.Value as string); 
} 

여기에 개선의 여지가있을거야. 이 변환을 수행하는보다 간결한 방법이 있습니까? 성능 고려 사항? 당신은 것입니다 :

var dictionary = new Dictionary<string, string>(MyOrderedDictionary); 

참고 : 대신 일반 SortedDictionary<TKey, TValue>를 사용하는 경우 나 .NET 4.

답변

5

코드가 두 가지 개선되었습니다. 첫째, while 대신 foreach를 사용할 수 있습니다. 그러면 GetEnumerator의 세부 정보가 숨겨집니다. 둘째, 복사 할 항목의 수를 알기 때문에 대상 사전에 필요한 공간을 미리 할당 할 수 있습니다.

using System.Collections.Specialized; 
using System.Collections.Generic; 
using System.Collections; 

class App 
{ 
    static void Main() 
    { 
    var myOrderedDictionary = new OrderedDictionary(); 
    myOrderedDictionary["A"] = "1"; 
    myOrderedDictionary["B"] = "2"; 
    myOrderedDictionary["C"] = "3"; 
    var dict = new Dictionary<string, string>(myOrderedDictionary.Count); 
    foreach(DictionaryEntry kvp in myOrderedDictionary) 
    {  
     dict.Add(kvp.Key as string, kvp.Value as string); 
    } 
    } 

} 

대체 방법 당신이 사전의 새로운 인스턴스 을 원하는 경우, 현재 위치에서 사전을 변환하고, 일부 기존 채워지지하기 위해 LINQ 사용 : 답변

using System.Linq; 
... 
var dict = myOrderedDictionary.Cast<DictionaryEntry>() 
.ToDictionary(k => (string)k.Key, v=> (string)v.Value); 
+0

답변 해 주셔서 감사합니다. 방망이에서'foreach'를 시도했지만'.Key'와'.Value'를 얻는 방법을 알아 내지 못했지만'DictionaryEntry kvp' 대신'var kvp'를 사용했습니다. 이제 좋아 보인다. 나는 또한 linq 접근법을 좋아한다. – lbstr

1

을 사용하고

, 당신은 단순히 IDictionary<TKey, TValue> 인수를 취하는 Dictionary<TKey, TValue> 생성자를 사용할 수 있습니다 이 아닌Dictionary의 메소드가 가상이 아니기 때문에 동일한 클래스를 사용하여 순서를 유지하고 Dictionary에서 파생 될 수 있어야합니다. 공개적으로 노출 된 라이브러리 메소드에서 Dictionary 대신에 IDictionary을 라이브러리 작성자가 사용해야했지만 지금은 처리하지 않아야합니다.

+0

감사합니다. SortedDictionary를 사용하는 사전의 생성자를 보았습니다. 나는 그것이 내 상황에서 정렬 될 수있는 키에 대한 문제인지 잘 모르겠습니다. 적어도 주문을 보장합니다. 이것은 제가가는 길일지도 모릅니다. 또한 도서관에 대한 저의 좌절감을 잘 표현해 주셔서 감사합니다. 그것은 불행한 상황입니다. – lbstr