C#字典获取最小值的键

22

今天对您来说可能很简单,但我现在正在兜圈子。考虑以下情况:

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"。
有什么想法吗?

1
可能是重复的问题在C#中获取Dictionary最高值对应键的好方法(并且编辑答案以反映这一点)。 - John Nicholas
5个回答

38

太好了,这正是我在常规linq中想要的。只等stackoverflow让我把它标记为我寻找的答案。谢谢 :) - Dezzamondo
当至少有两个键具有相同的最小值(最大条件相同)时会发生什么?在尝试实验时,我发现聚合返回找到的最后一个最小(或最大)值。如何处理两个或更多的最小或最大值? - Mark S

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

如果您的数据集规模较大,可以考虑使用moreLinq中的MinBy扩展。 在SO上这里有一个实现示例


谢谢spender,幸好列表的大小相当小,但moreLinq看起来是一个有用的工具,可以帮助我更好地掌握它。感谢你让我注意到它 :) - Dezzamondo

3
尝试这个: var val = tempDictionary.OrderBy(k => k.Value).FirstOrDefault(); Console.WriteLine(val.Key +" => "+val.Value); 这段代码涉及到it技术,它的作用是按照字典中值的大小对键进行排序,并输出第一个键值对。

我认为最好在第一行使用“First”来避免可能将“val”设置为“null”,从而更加安全。否则,在调用“Console.WriteLine”之前应进行“null”检查。 - spender

2

排序效率较低,需要O(n log n)的时间,但选择最小值仅需O(n)的时间。

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

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

使用这个方法,如果你删除.First(),甚至可以获取所有的最小值。


0

我曾经遇到过类似的问题,我更喜欢不对字典的值进行排序,而是通过单次迭代找到最小值(排序的时间复杂度大于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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接