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?
utilisant morelinq
var keyR = tempDictionary.MinBy(kvp => kvp.Value).Key;
ou
var min = tempDictionary.Aggregate((l, r) => l.Value < r.Value ? l : r).Key;
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.
Essaye celui-là : var val = tempDictionary.OrderBy(k => k.Value).FirstOrDefault(); Console.WriteLine(val.Key +" => "+val.Value);
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()
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);