2012-04-24 147 views
16

如何从Dictionary中获取MAX值?

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

我怎样才能得到一个Guid具有MAX价值?

+3

的可能重复[获取字符值的最大值()](http://stackoverflow.com/questions/7268605/get-max-of-alphanumeric-value) – 2012-04-24 02:06:56

+0

请尝试之前,做自己的研究对SO提出问题。 – 2012-04-24 02:07:49

+1

由于“GUID”代表“全球唯一标识符”,因此您会想要一个“最大”值,这似乎令人难以置信的奇怪。 GUID因其独特性而被使用;我想不出一个真实世界的应用程序,把它们看作是有序的。 – jpmc26 2014-05-08 10:15:34

回答

29

使用LINQ:

d.Keys.Max(); // Returns the greatest key 
+7

但他要求具有最大价值的钥匙。这只是给我们最大的关键,所以这是错误的。 – robbpriestley 2016-06-22 22:17:27

+0

这个问题可以用两种方式来解释,而且由于OP接受了这个答案,我可以假设这就是他的意思。 – Asik 2016-06-23 15:03:36

5

的Guid实现IComparable的,所以:

d.Keys.Max() 

而且目前还不清楚为什么人会想这样做......

9
  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()); 
+1

假设你想要最大日期时间的GUID ... – 2012-04-24 02:12:14

+1

重新阅读这个问题,我认为这是正确的解释,并且唯一的答案给出了正确的结果(尽管我怀疑它可以缩短与LINQ,它不会比这个显式循环更快)。 – 2012-04-24 02:14:21

+0

@BenVoigt显式循环在清晰度方面最好。另一篇文章[这里](https://stackoverflow.com/q/2805703/465053)有一些很好的答案。本文中接受的答案声称使用LINQ进行单一扫描。 – RBT 2017-09-04 07:52:56

29

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

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

固体代码完成这项工作 – 2016-03-10 00:37:26

+0

不错,虽然我会先将'd.Values.Max()'输出到一个变量中,否则它可能会在每次迭代中重复搜索Max()。 – Nyerguds 2017-09-21 07:21:04

0

另一种方式可能有助于获得单一KeyValuePair。

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

首先订购您的数据可能是一个解决方案。

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

接受的答案不适用于我。下面的代码(使用MoreLinq)虽然做了这项工作:

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

通过使用词典上的LINQ。

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