【问题标题】:Evaluating and comparing a variable to key pairs of a Dictionary评估变量并将其与字典的键对进行比较
【发布时间】:2012-03-27 23:51:50
【问题描述】:

我有一本包含直径(以毫米为单位)和欧元硬币价值的字典:

CoinsDiameters = new Dictionary<float, decimal>
                {
                    {25.75F, 2.00m},
                    {24.25F, 0.50m},
                    {23.25F, 1.00m},
                    {22.25F, 0.20m},
                    {21.25F, 0.05m},
                    {19.75F, 0.10m},
                    {18.75F, 0.02m},
                    {16.25F, 0.01m}
                };

例如,50 欧分硬币的直径为 24.25 毫米。经过一些图像处理后,我在直径为 24.1 毫米的图像中获得了 50 美分硬币的粗略直径。我试图通过记住 +/- 0.2 毫米的错误来编写下面的代码,但它总是返回字典中的第一个值(2.00 欧元硬币)。逻辑有什么问题?

public decimal GetValueForDiameter(float diameter)
{
    foreach(var key in CoinsDiameters.Keys)
    {
        if (diameter < key + 0.2F || diameter > key - 0.2F)
        {
            return CoinsDiameters[key];
        }
    }

    return 0;
}

【问题讨论】:

  • 你没有使用调试器,是吗?
  • 你应该使用&amp;&amp;而不是||

标签: c# dictionary ienumerable


【解决方案1】:

我认为您应该将 || 替换为 &amp;&amp; :)

【讨论】:

  • 没错。该逻辑首先检查直径是否小于 25.95 大于 25.55。显然这个检查总是正确的,因此任何输入都会返回字典中的第一个值。
  • 同意。这种逻辑似乎表明,只要直径不等于键值 (+- 0.2),该键就是所追求的。因此选择第一个是因为它总是符合条件的。
  • 我认为逻辑表明@Sean87 犯了一个我们可能在某个时候都犯过的简单错误。
  • 是的..那一刻我的大脑真的被绞死了,因为我花了太多时间进行图像处理,这个小错误对我来说就像攀登珠穆朗玛峰!
【解决方案2】:

你应该试试这个:

if (Math.Abs(diameter - key) <= 0.2F)

【讨论】:

  • @appclay 是的,我在发布并修复它之后就注意到了。我相信应该是&lt;= 0.2F
  • 嗯,这不会返回任何东西 :(
  • @Sean87 太好了! ......你让我有点害怕。我以为我的基础是正确的:)
猜你喜欢
  • 1970-01-01
  • 2017-06-21
  • 2019-05-17
  • 1970-01-01
  • 2021-04-21
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多