c#dictionary获取最小值的关键字

时间:2014-05-19 09:52:32

标签: c# linq dictionary

今天对你来说可能很简单,但我现在正在围成一圈。请考虑以下情况:

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

以上返回&#34;用户1 =&gt; 3&#34;

如何返回字典中值最小的键?之后的输出I#而不是:&#34; user2 =&gt; 3&#34;

有什么想法吗?

5 个答案:

答案 0 :(得分:22)

使用morelinq

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

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

来自Highest value of a Dictionary in C#

答案 1 :(得分:5)

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

如果您的数据集大小不重要,您可以考虑moreLinq中的MinBy扩展名。 Here's an implementation托管在SO。

答案 2 :(得分:2)

试试这个:
var val = tempDictionary.OrderBy(k => k.Value).FirstOrDefault(); Console.WriteLine(val.Key +" => "+val.Value);

答案 3 :(得分:1)

排序效率较低,因为需要O(n log n),但选择最小值应该只是O(n)。

我认为这是一种更简单的方法:

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

使用此功能,只需删除.First()

即可获得所有最小值

答案 4 :(得分:0)

我有一个类似的问题,我更喜欢不排序字典的值,但只是通过一次迭代找到min(排序是&gt; 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);