【问题标题】:c# dictionary get the key of the min valuec#字典获取最小值的键
【发布时间】:2014-07-07 05:35:06
【问题描述】:

今天对你来说可能是一个简单的问题,但我目前正在兜圈子。考虑这种情况:

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);

以上返回“用户 1 => 3”。

您将如何返回字典中具有最低值的键?我之后的输出看起来像这样:“user2 => 3”

有什么想法吗?

【问题讨论】:

标签: c# linq dictionary


【解决方案1】:

我有一个类似的问题,我不喜欢对字典的值进行排序,而只是通过一次迭代找到最小值(排序大于 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);

【讨论】:

    【解决方案2】:

    排序效率较低,因为它需要 O(n log n),但选择最小值应该只是 O(n)。

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

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

    如果你只删除.First(),你甚至可以获得所有最小值

    【讨论】:

      【解决方案3】:

      试试这个:
      var val = tempDictionary.OrderBy(k => k.Value).FirstOrDefault(); Console.WriteLine(val.Key +" => "+val.Value);

      【讨论】:

      • 我认为使用First 在第一行炸毁可能比将val 可能设置为null 更安全。否则,应在调用Console.WriteLine 之前进行null 检查。
      【解决方案4】:

      使用morelinq

      var keyR = tempDictionary.MinBy(kvp => kvp.Value).Key;
      

       var min = tempDictionary.Aggregate((l, r) => l.Value < r.Value ? l : r).Key;
      

      来自Highest value of a Dictionary in C#

      【讨论】:

      • 非常好,这正是我在常规 linq 中所追求的。只是在等待 stackoverflow,这样我就可以将其标记为我正在寻找的答案。谢谢:)
      【解决方案5】:
      var keyAndValue = tempDictionary.OrderBy(kvp => kvp.Value).First();
      Console.WriteLine("{0} => {1}", keyAndValue.Key, keyAndValue.Value);
      

      如果您的数据集大小不一,您可以考虑使用 moreLinq 中的 MinBy 扩展。 Here's an implementation 托管在 SO 上。

      【讨论】:

      • 感谢spender,谢天谢地,列表的大小非常小,但是moreLinq 看起来是一个有用的工具来掌握。感谢您引起我的注意:)
      猜你喜欢
      • 2014-03-08
      • 2021-12-11
      • 2021-12-06
      • 2018-08-02
      • 2012-04-14
      • 2022-12-02
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多