словарь c# получает ключ минимального значения
вероятно, простой для вас сегодня, но в настоящее время я хожу по кругу. Рассмотрим такой сценарий:
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);
вышеуказанное возвращает "user 1 => 3".
Как бы вы могли вернуть ключ с самым низким значением в словаре? Вывод, который я ищу, будет выглядеть так: "user2 => 3"
какие идеи?
5 ответов
используя morelinq
var keyR = tempDictionary.MinBy(kvp => kvp.Value).Key;
или
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);
Если ваш набор данных нетривиален по размеру, вы можете рассмотреть расширение MinBy в moreLinq. вот реализация размещено на SO.
попробуй это :var val = tempDictionary.OrderBy(k => k.Value).FirstOrDefault();
Console.WriteLine(val.Key +" => "+val.Value);
сортировка менее эффективна, поскольку требуется O(N log n), но выбор минимума должен быть только O (n).
Я думаю, что это более простой способ:
tempDictionary.Where(e => e.Value == tempDictionary.Min(e2 => e2.Value)).First()
используя это, вы даже можете получить все минимальные значения, если вы просто удалите .First()
У меня была аналогичная проблема, и я предпочел не упорядочивать значения словаря, а просто найти min с одной итерацией (порядок > O(N)). Возможно, вам придется остерегаться угловых случаев и тому подобного.
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);