如何从数组中找到最接近的数字,向下舍入

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 中的所有条目均按升序排列。

这是我能想到的最简单的解决方案,但由于要搜索整个数组,因此计算量可能会很大。