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,但是这种方法会抛出错误(说它不存在)...谢谢
答案 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];