如何从字典中获取 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由于这是公认的答案,我将尝试涵盖该问题的所有可能含义:
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”可能没有意义,因为它们只是为了成为唯一值,而不是代表任何可排序的概念。尽管如此,上述代码仍适用于支持>
运算符的任何类型,为了简洁起见,此处选择string
和int
。
【讨论】:
但他要求的是具有最大值的密钥。这只是给了我们最大的密钥,所以这是错误的。 如果有人想要最大值,那么他们可以使用 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 值?的主要内容,如果未能解决你的问题,请参考以下文章