2013-03-28 5 views
1

Вопрос:Лучший способ преобразовать OrderedDictionary в словарь <строка, строка>

Как конвертировать из OrderedDictionary в Dictionary<string, string> в краткой, но производительным способом?

Ситуация:

У меня есть LIB, что я не могу прикоснуться, что ожидает меня пройти Dictionary<string, string>. Я хочу создать 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); 
} 

Там должен быть возможности для улучшения положения. Есть ли более сжатый способ выполнения этого преобразования? Любые соображения производительности?

Я использую .NET 4.

ответ

5

Всего два улучшения вашего кода. Во-первых, вы можете использовать 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', но я использовал' var kvp' вместо 'DictionaryEntry kvp'. Выглядит хорошо. Мне также нравится подход linq. – lbstr

1

Если вы используете общий SortedDictionary<TKey, TValue> вместо этого, вы можете просто использовать Dictionary<TKey, TValue> конструктор, который принимает IDictionary<TKey, TValue> аргумент:

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

Примечание: Вы будете не могут использовать один и тот же класс для поддержания порядка и быть производным от Dictionary, потому что методы в Dictionary не являются виртуальными. Создатель библиотеки должен был использовать IDictionary вместо Dictionary на общедоступных библиотечных методах, но теперь им это не помогло.

+0

Спасибо за ответ. Я видел этот конструктор для словаря, который принимает 'SortedDictionary'. Я просто не уверен, что это проблема для сортировки ключей в моей ситуации. По крайней мере, он гарантирует заказ. Это может быть маршрут, по которому я иду. Кроме того, благодарю вас за то, что вы так сильно расстроили мое разочарование в библиотеке. Это печальная ситуация. – lbstr

Смежные вопросы