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
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);
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);
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);