Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.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#_Vb.net - Fatal编程技术网

C# 在数字列表中查找给定值周围最接近的两个数字的最便宜方法是什么?

C# 在数字列表中查找给定值周围最接近的两个数字的最便宜方法是什么?,c#,vb.net,C#,Vb.net,假设我们有一个数字列表: {1,3,7,13,19,54} 和单个值:17 找到列表中值周围最接近的2个数字的最便宜方法是什么。因此,在我们的示例中,答案是13和19 目前,我正在使用循环创建两个列表,一个是上面的数字,一个是下面的数字。然后我用这样的方法: point1 = pointsAbove.Aggregate(Function(x, y) If(Math.Abs(x.X - xVal) < Math.Abs(y.X - xVal), x, y)) point2 = points

假设我们有一个数字列表:

{1,3,7,13,19,54}
和单个值:
17

找到列表中值周围最接近的2个数字的最便宜方法是什么。因此,在我们的示例中,答案是
13
19

目前,我正在使用循环创建两个列表,一个是上面的数字,一个是下面的数字。然后我用这样的方法:

point1 = pointsAbove.Aggregate(Function(x, y) If(Math.Abs(x.X - xVal) < Math.Abs(y.X - xVal), x, y))
point2 = pointsBelow.Aggregate(Function(x, y) If(Math.Abs(x.X - xVal) < Math.Abs(y.X - xVal), x, y))
point1=pointsAbove.Aggregate(函数(x,y)If(Math.Abs(x.x-xVal)
这对我来说太笨重了。所以我期待着你

试试下面的代码:

List<int> numbers = new List<int>(){ 6, 7, 8, 9, 1, 2, 3, 4, 5 };
int middle = 6;

var min = numbers.Where(y => y < middle).Max(); // min = 5
var max = numbers.Where(y => y > middle).Min(); // max = 7
List number=newlist(){6,7,8,9,1,2,3,4,5};
int-middle=6;
var min=数字。其中(y=>yy>middle).Min();//最大值=7
上面的代码对于已排序和未排序的列表都可以正常工作

如果不能确定至少有一个最小值和/或一个最大值,则必须执行此操作,否则将出现异常:

var min = numbers.Where(y => y < middle).DefaultIfEmpty().Max(); 
var max = numbers.Where(y => y > middle).DefaultIfEmpty().Min();
var min=numbers.Where(y=>yy>middle).DefaultIfEmpty().Min();
而且,如果您100%确定列表已排序,您可以通过执行以下代码节省一点性能:

var min = numbers.LastOrDefault(y => y < middle); 
var max = numbers.FirstOrDefault(y => y > middle);
var min=numbers.LastOrDefault(y=>yy>middle);

我希望它对您有所帮助。

因为您没有指定如果单个值(17)的值不小于或大于该值时会发生什么,所以我将在这里让它们默认为NULL

int number = 17; 
int? lower = points.LastOrDefault(x => x < number);
int? upper = points.FirstOrDefault(x => x > number);
int number=17;
智力?lower=点数。LastOrDefault(x=>xx>number);
或者在一行中,尽管这在我看来更难看

Tuple<int?, int?> closestNumbers = new Tuple<int?, int?>(points.LastOrDefault(x => x < number), points.FirstOrDefault(x => x > number));
Tuple closestNumbers=新元组(points.LastOrDefault(x=>xx>number));

假设您的列表已排序,您不需要迭代列表,该列表将及时成为
O(n)
。使用二进制搜索,它可以在
O(log(n))
中处理

所以我的问题是:最快的代码(加上最少的内存)和最短的代码。。。你的问题没有说明这一点

顺便说一句:处理拐角处的案件并不容易

var list = new List<int> { 1, 3, 7, 13, 20, 54 };
var numToSearch = 54;
int point1 = int.MinValue, point2 = int.MinValue;

var inx = list.BinarySearch(numToSearch); //<---


if (inx >= 0) //search item is in the list
{
    if (inx == 0)
    {
        point1 = list[0];
        point2 = list[1];
    }
    else if (inx == list.Count - 1)
    {
        point1 = list[inx - 1];
        point2 = list[inx];
    }
    else
    {
        int val1 = list[inx - 1];
        int val2 = list[inx + 1];

        if (Math.Abs(val1 - list[inx]) < Math.Abs(list[inx] - val2))
        {
            point1 = list[inx - 1];
            point2 = list[inx];
        }else
        {
            point1 = list[inx];
            point2 = list[inx+1];
        }
    }
}
else {
    point1 = list[~inx - 1];
    point2 = list[~inx];
}
var list=新列表{1,3,7,13,20,54};
var numToSearch=54;
int point1=int.MinValue,point2=int.MinValue;
var inx=list.BinarySearch(numToSearch);//=0)//搜索项在列表中
{
如果(inx==0)
{
点1=列表[0];
点2=列表[1];
}
else if(inx==list.Count-1)
{
点1=列表[inx-1];
点2=列表[inx];
}
其他的
{
int val1=列表[inx-1];
int val2=列表[inx+1];
if(Math.Abs(val1-list[inx])
PS:最短时间?记忆最少?最少代码?难以同时实现(如果不是不可能的话)。似乎OP会随机选择一个答案:)


PS2:我不希望OP在读了前面的注释后会接受这个答案:)

你说的“最便宜”是什么意思?最少的时间?记忆最少?最少编码?列表是否已排序?请StackOverflow上的人员为您编写。没有比免费更便宜的了。@EdPlunkett这就是我所指望的。您希望如何处理相等?非常好,这将代码从6行减少到了2行,并且避免了声明2个列表。我喜欢使用LINQ!另外,感谢这两种情况(未排序排序)@马修古拉特:我把订购单拿走了,没必要了。上述代码甚至适用于未排序的列表。:)我喜欢它会生成一个异常,如果有一个点丢失。我在做一些简单的线性插值,所以这很有意义。@MatthewGoulart如果你在做插值,DefaultIfEmpty会接受一个int参数来表示你想要的默认值。您可以在第一个函数中传递插值的低端,在第二个函数中,您可以传递插值的高端。这也是一个选择。