我正在尝试创建一个“查找”列,该列将返回等于或小于正在查找的值的数组值的索引。所以这是我的尝试,似乎工作正常,但我想知道是否有更清洁的方法吗?
// 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;
}
感谢。
答案 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;
}