web-dev-qa-db-fra.com

dictionnaire c # obtenir la clé de la valeur min

probablement simple pour vous aujourd'hui, mais je tourne actuellement en rond. Considérez ce scénario:

var tempDictionary = new Dictionary<string, int>();
tempDictionary.Add("user 1", 5);
tempDictionary.Add("user 2", 3);
tempDictionary.Add("user 3", 5);

Console.WriteLine(tempDictionary.Min(x => x.Key) + " => " tempDictionary.Min(x => x.Value);

Ce qui précède renvoie "utilisateur 1 => 3".

Comment feriez-vous pour renvoyer la clé avec la valeur la plus basse dans un dictionnaire? La sortie que je cherche ressemble à ceci: "utilisateur2 => 3"

Des idées?

10
Dezzamondo

utilisant morelinq

var keyR = tempDictionary.MinBy(kvp => kvp.Value).Key;

ou

 var min = tempDictionary.Aggregate((l, r) => l.Value < r.Value ? l : r).Key;

from Valeur la plus élevée d'un dictionnaire en C #

21
Sajeetharan
var keyAndValue = tempDictionary.OrderBy(kvp => kvp.Value).First();
Console.WriteLine("{0} => {1}", keyAndValue.Key, keyAndValue.Value);

Si la taille de votre ensemble de données est non triviale, vous pouvez envisager l’extension MinBy dans moreLinq . Voici une implémentation hébergée sur SO.

5
spender

Essaye celui-là :
var val = tempDictionary.OrderBy(k => k.Value).FirstOrDefault(); Console.WriteLine(val.Key +" => "+val.Value);

2
Muna

Le tri est moins efficace car il faut O (n log n), mais choisir le minimum ne devrait être que O (n).

Je pense que c'est un moyen plus facile:

tempDictionary.Where(e => e.Value == tempDictionary.Min(e2 => e2.Value)).First()

en utilisant cela, vous pouvez même obtenir toutes les valeurs minimales si vous supprimez simplement .First()

1
sharno

J'avais un problème similaire et je préférais ne pas ordonner les valeurs du dictionnaire, mais simplement trouver le minimum avec une seule itération (l'ordre est> O (N)). Vous devrez peut-être vous prémunir contre les cas de virage et similaires.

    var s = String.Empty;
    var min = Int32.MaxValue;
    foreach (var item in tempDictionary) {
        if (item.Value < min){
            s = item.Key;
            min = item.Value;
        }
    }

    Console.WriteLine(s + " => " + min);
0
Andrea C