словарь 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;

С самое высокое значение словаря в C#


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