使用Array.BinarySearch()返回第一个值< =查找值?

时间:2010-08-10 19:54:04

标签: c# arrays lookup where-clause binary-search

我正在尝试创建一个“查找”列,该列将返回等于或小于正在查找的值的数组值的索引。所以这是我的尝试,似乎工作正常,但我想知道是否有更清洁的方法吗?

// Sorted
float[] ranges = new float[]
  {
     0.8f,
     1.1f,
     2.7f,
     3.9f,
     4.5f,
     5.1f,
  };


private int GetIndex(float lookupValue)
{
    int position = Array.BinarySearch(ranges, lookupValue);
    if (position < 0)
    {
        // Find the highest available value that does not
        // exceed the value being looked up.
        position = ~position - 1;
    }

    // If position is still negative => all values in array 
    // are greater than lookupValue, return 0
    return position < 0 ? 0 : position;
}

感谢。

2 个答案:

答案 0 :(得分:3)

不,我认为这是一个非常好的方法。

我唯一可能改变的是使它成为数组的扩展方法,而不是引用类变量的私有函数。然后它变得通用/不依赖于一个类,语法也更清晰:ranges.GetIndex(...)

这样的事情:

public static class Extensions
{
    public static int GetIndex<T>(this T[] ranges, T lookupValue)
    {
        // your code here
    }
}

当然,你必须记住这只适用于排序数组......

答案 1 :(得分:1)

您可以使用普通for循环(假设您的数据已订购)。不确定它是否更干净,但对大量数据肯定不那么有效。我个人会选择你的二进制搜索。

int GetIndex(IList<float> ranges, float target)
{
    for (int i = 0; i < ranges.Count; i++)
    {
        if(ranges[i] < target) continue;
        if (ranges[i] >= target) return i;
    }
    return 0;
}