如何从字典中获取 MAX 值?

Posted

技术标签:

【中文标题】如何从字典中获取 MAX 值?【英文标题】:How to get MAX value from Dictionary? 【发布时间】:2012-04-24 02:02:58 【问题描述】:

我有

Dictionary<Guid, DateTime> d = new Dictionary<Guid, DateTime>();

如何获得具有MAX 值的Guid

【问题讨论】:

Get Max() of alphanumeric value 的可能重复项 在提出关于 SO 的问题之前,请尝试自己进行研究。 由于“GUID”代表“全局唯一标识符”,您想要一个“最大值”似乎非常奇怪。使用 GUID 是因为它的唯一性;我想不出一个真实世界的应用程序,其中将它们视为有序是有意义的。 我想你可能完全错过了 jpmc26 的重点。例如,假设我有 var fooDict = new Dictionary();其中字符串值是 GUID,我想知道哪个 kvp 具有最高的 int 值(使用 MoreLinq): var maximumIntKey = fooDict .MaxBy(kvp => kvp.Value).Key; var largeInt = fooDict [biggestIntKey]。而且我认为几乎所有阅读 SO 的人都知道 GUID 是什么。没有帮助。 完全相同的问题here。 【参考方案1】:

由于这是公认的答案,我将尝试涵盖该问题的所有可能含义:

var dict = new Dictionary<string, int>   "b", 3 ,  "a", 4  ;

// greatest key
var maxKey = dict.Keys.Max(); // "b"

// greatest value
var maxValue = dict.Values.Max(); // 4

// key of the greatest value
// 4 is the greatest value, and its key is "a", so "a" is the answer.
var keyOfMaxValue = dict.Aggregate((x, y) => x.Value > y.Value ? x : y).Key; // "a"

注意:问题的键类型为 System.Guid。问“什么是最大的 GUID”可能没有意义,因为它们只是为了成为唯一值,而不是代表任何可排序的概念。尽管如此,上述代码仍适用于支持&gt; 运算符的任何类型,为了简洁起见,此处选择stringint

【讨论】:

但他要求的是具有最大值的密钥。这只是给了我们最大的密钥,所以这是错误的。 如果有人想要最大值,那么他们可以使用 d.Values.Max();【参考方案2】:

这很好用。它将返回 MAX 日期的 GUID。

Dictionary<Guid, DateTime> d = new Dictionary<Guid, DateTime>(); 
var guidForMaxDate = d.FirstOrDefault(x => x.Value == d.Values.Max()).Key;

【讨论】:

很好,虽然我会提前将 d.Values.Max() 放入变量中,否则它可能会在每次迭代中重复搜索 Max()。【参考方案3】:
            var maxGuid = Guid.Empty;
            var maxDateTime = DateTime.MinValue;
            foreach (var kvp in d)
            
                if (kvp.Value > maxDateTime)
                
                    maxGuid = kvp.Key;
                    maxDateTime = kvp.Value;
                
            
            Console.WriteLine("Guid of max date is: " + maxGuid.ToString());

【讨论】:

重新阅读问题,我认为这是正确的解释,也是唯一给出正确结果的答案(虽然我怀疑它可以用 LINQ 缩短,但不会更快比这个显式循环)。 @BenVoigt 显式循环在清晰度方面是最好的选择。另一个帖子here 有一些很好的答案。这篇文章中接受的答案声称使用 LINQ 进行单次扫描。【参考方案4】:

首先对数据进行排序可能是一种解决方案。

var maxGuid = d.OrderByDescending(x => x.Value).FirstOrDefault().Key;

【讨论】:

与仅返回最高值相比,对整个列表进行排序有点昂贵 OrderByDescending 返回一个 IOrderedEnumerable(它是一个 IEnumerable 公开更多排序选项,如 ThenBy 或 ThenByDescending)。此代码只会遍历数据一次,以获取最高值,然后将输出第一个。它不会重新排序所有列表,除非您将其具体化并将其存储在某个地方,例如使用 .ToArray() 存储在某个变量中。 FirstOrDefault 只会获取第一项(如果存在),并且不会遍历这些值。它与其他答案有何不同?你知道 linq .Max 或 .MaxBy 扩展是如何工作的吗?【参考方案5】:

Guid 实现了 IComparable,所以:

d.Keys.Max()

也不清楚为什么要这样做......

【讨论】:

【参考方案6】:

通过在字典上使用 LINQ。

var MaximumValue = dict.FirstOrDefault(x => x.Value.Equals(dict.Values.Max()));

【讨论】:

【参考方案7】:

接受的答案对我不起作用。以下代码(使用 MoreLinq)完成了这项工作:

var fooDict = new Dictionary<string, int>();
var keyForBiggest = fooDict.MaxBy(kvp => kvp.Value).Key;
var biggestInt = fooDict[keyForBiggest];

【讨论】:

【参考方案8】:

另一种方法可能有助于获得 Single KeyValuePair。

KeyValuePair<char, int> GuidKeyPair = guidDict.FirstOrDefault( MaxGuid => MaxGuid.Value == guidDict.Values.Max());

【讨论】:

以上是关于如何从字典中获取 MAX 值?的主要内容,如果未能解决你的问题,请参考以下文章

C# - 字典 - 如何在字典中获取特定类值的最大值? [复制]

python选择字典中更大的值

Python:如何从熊猫系列的字典中获取值

如何从python中的字典列表中获取值?

如何从json.loads()字典中获取值?

从数字字典中获取最高值作为字符串[重复]