如何从数组中找到最接近的数字,向下舍入
How can I find the closest number from an array, rounding down
我要做的是获取一组逐渐变大的数字,以确定我可以四舍五入到的最高数字。我不确定这是否有意义,我将举一个例子。请记住,为了便于解释,我使数字更简单,删除最后一位数字是行不通的。我使用的数组有 100 个数以百万计。
int[] breakpoint = new int[] {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
110, 120, 130, 140, 150, 160, 170, 180, 190, 200};
int totalValue = 153;
int valueDisplayed;
//???
label.Text = valueDisplayed.toString();
所以在这种情况下我想要的是 return 值为 15(数组中项目的索引),这样我就可以显示该值(例如带有标签)。当然必须有一个简单的方法来做到这一点?我无法在任何地方找到答案。
简单的实现可能就足够了
valueDisplayed = breakpoint[Array.FindIndex(breakpoint, v => v > totalValue) - 1];
但您可能想进行二分查找以加快速度
您可以使用 Array.BinarySearch
,它提供了您需要知道的所有信息:
public static int GetNearestIndex<T>(T[] items, T value)
{
int index = Array.BinarySearch(items, value);
if(index >= 0)
return index;
if(index == -1)
return 0; // is lower than first, so maybe you want to return -1
return ~index - 1;
}
我正在使用 bitwise complement operator 来确定正确的索引。
.Net Fiddle 有一些边缘情况。
您可以使用 System.Linq
找到您的舍入断点数组的索引。
var index = breakpoint.Where(i => i <= totalValue).ToList().Count - 1;
这行代码将 select 数组中低于 totalValue
的所有元素放入列表中,并对其进行计数。要获得索引,只需从中减去 1。
此解决方案假定 breakpoint
中的所有条目均按升序排列。
这是我能想到的最简单的解决方案,但由于要搜索整个数组,因此计算量可能会很大。
我要做的是获取一组逐渐变大的数字,以确定我可以四舍五入到的最高数字。我不确定这是否有意义,我将举一个例子。请记住,为了便于解释,我使数字更简单,删除最后一位数字是行不通的。我使用的数组有 100 个数以百万计。
int[] breakpoint = new int[] {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
110, 120, 130, 140, 150, 160, 170, 180, 190, 200};
int totalValue = 153;
int valueDisplayed;
//???
label.Text = valueDisplayed.toString();
所以在这种情况下我想要的是 return 值为 15(数组中项目的索引),这样我就可以显示该值(例如带有标签)。当然必须有一个简单的方法来做到这一点?我无法在任何地方找到答案。
简单的实现可能就足够了
valueDisplayed = breakpoint[Array.FindIndex(breakpoint, v => v > totalValue) - 1];
但您可能想进行二分查找以加快速度
您可以使用 Array.BinarySearch
,它提供了您需要知道的所有信息:
public static int GetNearestIndex<T>(T[] items, T value)
{
int index = Array.BinarySearch(items, value);
if(index >= 0)
return index;
if(index == -1)
return 0; // is lower than first, so maybe you want to return -1
return ~index - 1;
}
我正在使用 bitwise complement operator 来确定正确的索引。
.Net Fiddle 有一些边缘情况。
您可以使用 System.Linq
找到您的舍入断点数组的索引。
var index = breakpoint.Where(i => i <= totalValue).ToList().Count - 1;
这行代码将 select 数组中低于 totalValue
的所有元素放入列表中,并对其进行计数。要获得索引,只需从中减去 1。
此解决方案假定 breakpoint
中的所有条目均按升序排列。
这是我能想到的最简单的解决方案,但由于要搜索整个数组,因此计算量可能会很大。