1

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を使用しています。

4

2 に答える 2

6

コードを 2 つだけ改善します。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);
于 2013-03-28T21:17:32.240 に答える
1

SortedDictionary<TKey, TValue>代わりにジェネリックを使用する場合は、引数Dictionary<TKey, TValue>を取るコンストラクターを使用できます。IDictionary<TKey, TValue>

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

注:のメソッドは仮想ではないため、同じクラスを使用して順序を維持し、派生させることはできません。ライブラリの作成者は、公開されているライブラリ メソッドの代わりに使用する必要がありましたが、そうではなかったので、対処する必要があります。DictionaryDictionaryIDictionaryDictionary

于 2013-03-28T21:13:11.287 に答える