将OrderedDictionary转换为Dictionary <string,string =“”> </string,>的更好方法

时间:2013-03-28 21:08:10

标签: .net .net-4.0

如何以简洁而高效的方式从OrderedDictionary转换为Dictionary<string, string>

情况:

我有一个我无法触及的图书馆希望我通过Dictionary<string, string>。我想建立一个OrderedDictionary,因为在我的代码中,顺序非常重要。所以,我正在使用OrderedDictionary,当需要点击库时,我需要将其转换为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.

2 个答案:

答案 0 :(得分:5)

只需对代码进行两项改进。首先,您可以使用foreach代替while。这将隐藏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);

答案 1 :(得分:1)

如果您使用通用SortedDictionary<TKey, TValue>,则只需使用带有Dictionary<TKey, TValue>参数的IDictionary<TKey, TValue>构造函数:

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

注意:您将 能够使用同一个类维护订单并从Dictionary派生,因为{{1}中的方法不是虚拟的。图书馆创建者应该在公开的库方法上使用Dictionary而不是IDictionary,但他们现在不需要处理它。