2010-12-29 17 views
34

KeyValuePairのリストを辞書に変換することは可能ですが、その逆の操作を実行するための迅速な方法があります(手動でループする以外に)?辞書をリストに変換する<KeyValuePair>

これは、手動の方法であること

foreach (KeyValuePair<double,double> p in dict) 
{ 
    list.Add(new KeyValuePair<double,double>(p.Key,p.Value)); 
} 

本当に悪くないんだけど、興味があったでしょう。 List<KeyValuePair<TKey, TValue>>Dictionary<TKey, TValue>を変換するには

+2

新しいKeyValuePairsを作成する必要はありません。これははるかに簡単です: 'foreach(KeyValuePair p in dict){list.Add(p); } ' – phoog

答えて

79

あなただけDictionary<TKey, TValue>IEnumerable<KeyValuePair<TKey, TValue>>を実装しているためこれは

var list = dictionary.ToList(); 

以上の冗長

var list = dictionary.ToList<KeyValuePair<TKey, TValue>>(); 

を言うことができます。KeyValuePair項目です

myDict.ToList<KeyValuePair<double, double>>(); 

辞書の要素:LINQを使用して

+8

' System.Linq; 'をusingとして追加しなければならないことに注目する価値があります。 – Harry

+1

これは答え –

5

Jasonは言いました。しかし、実際にリストが必要ない場合は、ICollection < TKey、TValue >にキャストすることができます。なぜなら、このインターフェースを実装するためですが、明示的にしか使えない部分があるからです。このメソッドは、リスト全体をコピーせず、同じディクショナリインスタンスを再利用するだけで、パフォーマンスが向上します。 .NET 2.0の場合

+0

としてマークされるべきです。 'ToList'は辞書項目への参照を単にコピーするだけです。これは驚くほど速く、関連するパフォーマンス上の問題となる可能性は非常に低いです。 – jason

+2

キャスティングは無限に高速です。あなたが小さなリストで数回だけ行うのであれば目立たないですが、それでも多くのことが重要です。 – fejesjoco

+1

@Jason:そうではありません。拡張メソッドEnumerable.ToList >の呼び出しは、潜在的に高価です。別の観点からは、新しいリストを返す必要があります。そうでなければ、リストに項目を追加することによって辞書に項目を追加できます。これは変です。 – JBSnorro

0

Dictionary<TKey, TValue> dictionary = new Dictionary<TKey, TValue>(); 
List<KeyValuePair<TKey, TValue>> myList = new List<KeyValuePair<TKey, TValue>>(dictionary); 
0

私がIDictionaryのあるException.Dataのインスタンスを列挙しようとしてきました。これは最終的にうまくいきました:

ICollection keys = idict.Keys; 
    foreach(var key in keys) 
    { 
     var value = idict[key]; 
     Console.WriteLine("{0}: {1}", key, value); 
    } 
関連する問題