web-dev-qa-db-fra.com

Convertir un IOrderedEnumerable <KeyValuePair <chaîne, int >> en un Dictionnaire <chaîne, int>

Je suivais la réponse à une autre question , et j'ai obtenu:

// 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 demande un paramètre Func<string, int> keySelector. J'ai essayé de suivre quelques exemples semi-pertinents que j'ai trouvés en ligne et mis dans k => k.Key, mais cela donne une erreur de compilation: 

'System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string,int>>' ne contient pas de définition pour 'ToDictionary' et la meilleure surcharge de méthode d'extension 'System.Linq.Enumerable.ToDictionary<TSource,TKey>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,TKey>)' contient des arguments non valides

36
Kache

Vous spécifiez des arguments génériques incorrects. Vous dites que TSource est une chaîne, alors qu'en réalité c'est un KeyValuePair.

Celui-ci est correct:

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

avec la version courte étant:

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

Je crois que la façon la plus propre de faire les deux ensemble: trier le dictionnaire et le reconvertir en dictionnaire serait:

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

La question est trop ancienne, mais j'aimerais quand même donner une réponse pour référence:

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