1

重複の可能性:
IEnumerableから辞書を再作成する

タイプの辞書でWhereメソッドを使用すると、最終的にaDictionary<TKey, TValue>IEnumerable<KeyValuePair<TKey, TSource>>なり、最初に選択したデータ型が壊れます。辞書を返却したいのですが。

たぶん私は正しいフィルター機能を使用していません。では、通常、辞書から要素をどのようにフィルタリングしますか?

ありがとう

4

4 に答える 4

2

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が、少し裏話が傷つくことはありません。

于 2012-06-26T12:05:44.767 に答える
1

最後にどう.ToDictionary()ですか?

于 2012-06-25T10:13:41.227 に答える
1

Where()を使用して、 ToDictionary()を続けることができます。

var newDict = yourDict.Where(pair => SomePredicateFrom(pair))
                      .ToDictionary(pair => pair.Key, pair => pair.Value);
于 2012-06-25T10:13:45.897 に答える
1

.ToDictionary();LINQ式で使用します。

于 2012-06-25T10:14:45.753 に答える