在数组中获取最接近的值

时间:2016-12-22 07:36:02

标签: c# arrays math int min

int [] testArray = new int[3] { 5, 7, 8};

int check = 22;

var nearest = testArray.Min(x => Math.Abs(x - check));

Debug.Print(Convert.ToString(nearest));

我有上面的代码试图尝试获取最接近支票号的数组中最接近的数字,在本例中为22。

事情是,由于Math.Abs​​,它总是返回一个正值,但如果我删除它,代码完全失败。例如,如果支票号是10,我想最接近返回-2而不是2.这样我就可以将最近的值添加到支票号以获得数组中的正确值。

我在搜索时发现了类似的东西,名为MoreLinq,建议使用array.MinBy,但是这种方法会抛出错误(说它不存在)...谢谢

3 个答案:

答案 0 :(得分:3)

我会在min上提出第一个订单并取第一个值。这是你最接近的价值,你可以用它做你想要的。例如,计算nearest-check

int[] testArray = new int[3] { 5, 7, 8 };

int check = 22;

var nearest = testArray.OrderBy(x => Math.Abs(x - check)).First();

Debug.Print(Convert.ToString(nearest-check));

答案 1 :(得分:0)

试试testArray.Aggregate((min, next) => Math.Abs(next - check) > Math.Abs(min - check) ? min : next)。它必须比OrderBy()更快。

答案 2 :(得分:0)

如果保证对源数组进行排序,则可以使用Array.BinarySearch。我保证它会比你找到的任何LINQ解决方案都快。

int[] arr = { 3, 5, 7 };
int idx = Array.BinarySearch(arr, 3);
int closest = idx < 0 ? arr[~idx] : arr[idx];