Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找数组中最接近的最小值_C#_.net_Linq - Fatal编程技术网

C# 查找数组中最接近的最小值

C# 查找数组中最接近的最小值,c#,.net,linq,C#,.net,Linq,我的代码如下 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 = 2

我的代码如下

    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#比较陌生,希望能得到一些帮助。

根据您的预期输出,您正在尝试查找小于
搜索值的关闭值。试试下面

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}");
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.95};
var值=22;
双最近值=搜索值
.Where(x=>xy)//按升序对结果值排序
.LastOrDefault()//从数组中获取最大值。
WriteLine(最近的==0&&searchValue>0?“无效输入”:$“最近的值:{nearest}”);

您可以将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);

一个值通常不能同时是“最接近X”和“具有最小绝对值”。。。请重新阅读问题,看看是否有人能澄清您想要实现的目标(不应该是“只看小于X的值”),如果
searchValue
10
,最接近的值是什么?仅通过阅读标题和查看输入参数,我不清楚,最后一部分的目的是什么。如果您只想要小于searchValue的值,可以在搜索中应用where子句:
double-nearchest=searchValues.where(x=>xnew{Value=p,Difference=Math.Abs(p-searchValue)})。OrderBy(p=>p.Difference)。First().Value。并不是说,如果没有找到较小的值,则此操作将失败。你得检查一下。如果这不是你要找的,我也不了解你的实际问题,因为21.65是最接近的数字,没有任何其他条件。正如@AlexeiLevenkov已经说过的,请重新写下你的问题,以便让别人容易理解你要找的。您正在查找小于X的最近值。您的代码和输入,预期的输出是说其他的东西。代码片段会根据您的需要提供所需的输出!正是我要找的!非常感谢。