重複の可能性:
IEnumerableから辞書を再作成する
タイプの辞書でWhereメソッドを使用すると、最終的にaDictionary<TKey, TValue>
にIEnumerable<KeyValuePair<TKey, TSource>>
なり、最初に選択したデータ型が壊れます。辞書を返却したいのですが。
たぶん私は正しいフィルター機能を使用していません。では、通常、辞書から要素をどのようにフィルタリングしますか?
ありがとう
重複の可能性:
IEnumerableから辞書を再作成する
タイプの辞書でWhereメソッドを使用すると、最終的にaDictionary<TKey, TValue>
にIEnumerable<KeyValuePair<TKey, TSource>>
なり、最初に選択したデータ型が壊れます。辞書を返却したいのですが。
たぶん私は正しいフィルター機能を使用していません。では、通常、辞書から要素をどのようにフィルタリングしますか?
ありがとう
IDictionary<TKey, TValue>
実際に拡張しIEnumerable<KeyValuePair<TKey, TValue>>
ます。IDictionary<TKey, TValue>
これが、そもそもLINQ演算子をで使用できる理由です。
ただし、LINQ演算子は、遅延実行IEnumerable<T>
を提供することを目的として返されます。つまり、の反復を開始するまで、結果は実際には生成されません。IEnumerable<T>
IEnumerable<T>
によって提供される実装IDictionary<TKey, TValue>
は、ICollection<T>
インターフェイス(ここでT
、はKeyValuePair<TKey, TValue>
)を経由します。つまり、LINQがIDictionary<TKey, TValue>
代わりに戻る場合IEnumerable<KeyValuePair<TKey, TValue>>
は、リストを実体化して、そのプリンシパルに違反する必要があります(したがって、IEnumerable<KeyValuePair<TKey, TValue>>
戻り値)。
もちろん、それを回避するToDictionary
方法は(他の人が述べているように)でextensionメソッドを呼び出すことですEnumerable class
が、少し裏話が傷つくことはありません。
最後にどう.ToDictionary()
ですか?
Where()を使用して、 ToDictionary()を続けることができます。
var newDict = yourDict.Where(pair => SomePredicateFrom(pair))
.ToDictionary(pair => pair.Key, pair => pair.Value);
.ToDictionary();
LINQ式で使用します。