【问题标题】:How to get MAX value from Dictionary?如何从字典中获取 MAX 值?
【发布时间】: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

标签: c# .net linq dictionary


【解决方案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());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-10
          相关资源
          最近更新 更多