【问题标题】:Finding the smallest closest value in an array [closed]在数组中查找最小的最接近值[关闭]
【发布时间】:2020-12-03 05:12:33
【问题描述】:

我有如下代码

    var searchValues = new double[] { 21.1, 21.65, 22.2, 22.75, 23.3, 23.85, 24.4, 24.95, 25.5, 26.05, 26.6, 27.15, 27.7, 28.25, 28.8, 29.35, 29.9, 30.45, 31, 31.55, 32.1, 32.65, 33.2, 33.75, 34.3, 34.85, 35.4, 35.95 };
    var searchValue = 22;

  double nearest = searchValues .Select(p => new { Value = p, Difference = Math.Abs(p - searchValue ) })
                                  .OrderBy(p => p.Difference)
                                  .First().Value;

此代码返回 22.2 。但是我希望结果是接近 22 的最小值,即 21.65。我如何实现这一目标?我对 C# 比较陌生,希望能得到一些帮助。

【问题讨论】:

  • 一个值一般不能同时是“最接近X”和“具有最小绝对值”...请重新阅读问题,看看有没有edit可以阐明你想要达到的目标(不应该是“只看小于 X 的值”)
  • 如果searchValue10,预计最接近的值是多少?
  • 仅通过阅读标题并查看输入参数,我不清楚你想用最后一部分实现什么。
  • 如果您只需要小于 searchValue 的值,您可以将 where 子句应用于您的搜索:double nearest = searchValues.Where(x => x < searchValue).Select(p => new{Value = p, Difference = Math.Abs(p - searchValue)}).OrderBy(p => p.Difference).First().Value;。并不是说如果没有找到更小的值,这将失败。你必须检查一下。如果这不是您要找的,我也没有得到您的实际问题,因为 21.65 是最接近的数字,没有任何其他条件。
  • 正如@AlexeiLevenkov 已经说过的那样,请重新编写您的问题,以便其他人容易理解您在寻找什么。您正在寻找"closest value which is less than X"。你的代码和输入,预期的输出是在说别的东西

标签: c# .net linq


【解决方案1】:

根据您的预期输出,您试图找到 小于 searchValue 的封闭值。试试下面

var searchValues = new double[] { 21.1, 21.65, 22.2, 22.75, 23.3, 23.85, 24.4, 24.95, 25.5, 26.05, 26.6, 27.15, 27.7, 28.25, 28.8, 29.35, 29.9, 30.45, 31, 31.55, 32.1, 32.65, 33.2, 33.75, 34.3, 34.85, 35.4, 35.95 };
var searchValue = 22;

double nearest = searchValues
    .Where(x => x <= searchValue)  //Filter all values which are less than or equal to searchValue
    .OrderBy(y=> y)               //Order resultant values by ascending order
    .LastOrDefault();             //Get the max value from an array.

Console.WriteLine(nearest == 0 && searchValue > 0 ? "Invalid Input" : $"Nearest Value : {nearest}");

.net Fiddle

【讨论】:

  • 太棒了!正是我想要的!谢谢!
【解决方案2】:

您可以只应用 Math.Round() 的差异。

       var searchValues = new double[] { 21.1, 21.65, 22.2, 22.75, 23.3, 
                          23.85, 24.4, 24.95, 25.5, 26.05, 26.6, 27.15, 27.7, 
                          28.25, 28.8, 29.35, 29.9, 30.45, 31, 31.55, 32.1, 
                          32.65, 33.2, 33.75, 34.3, 34.85, 35.4, 35.95 };
        var searchValue = 22;

        double nearest = searchValues.Select(p => new { Value = p, Difference 
                                   = Math.Round(Math.Abs(p - searchValue)) })
                                        .OrderBy(p => p.Difference)
                                        .First().Value;

        Console.WriteLine(nearest);

【讨论】:

  • 上面的代码 sn-p 给出你想要的输出
猜你喜欢
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多