web-dev-qa-db-ja.com

IOrderedEnumerable <KeyValuePair <string、int >>をDictionary <string、int>に変換します

私は 別の質問への回答 をたどっていました。

_// itemCounter is a Dictionary<string, int>, and I only want to keep
// key/value pairs with the top maxAllowed values
if (itemCounter.Count > maxAllowed) {
    IEnumerable<KeyValuePair<string, int>> sortedDict =
        from entry in itemCounter orderby entry.Value descending select entry;
    sortedDict = sortedDict.Take(maxAllowed);
    itemCounter = sortedDict.ToDictionary<string, int>(/* what do I do here? */);
}
_

Visual Studioによるパラメーターの要求_Func<string, int> keySelector_。私がオンラインで見つけて_k => k.Key_に入れたいくつかの準関連の例を試してみましたが、コンパイラエラーが発生します。

_'System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string,int>>'_に 'ToDictionary'の定義が含まれておらず、最適な拡張メソッドオーバーロード'System.Linq.Enumerable.ToDictionary<TSource,TKey>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,TKey>)'に無効な引数が含まれています

37
Kache

誤った総称引数を指定しています。 TSourceは文字列であり、実際にはKeyValuePairであると言っています。

これは正しいです:

sortedDict.ToDictionary<KeyValuePair<string, int>, string, int>(pair => pair.Key, pair => pair.Value);

短いバージョンで:

sortedDict.ToDictionary(pair => pair.Key, pair => pair.Value);
54
Rotsor

私は両方を一緒に行う最もクリーンな方法を信じています:辞書を並べ替えてそれを辞書に戻す変換は次のようになるでしょう:

itemCounter = itemCounter.OrderBy(i => i.Value).ToDictionary(i => i.Key, i => i.Value);
9
CB01

質問は古すぎますが、参考のために回答を提供したいと思います。

itemCounter = itemCounter.Take(maxAllowed).OrderByDescending(i => i.Value).ToDictionary(i => i.Key, i => i.Value);
0
Dipesh Bhanani