Простой подход заключается в том, чтобы сохранить значения нижней полосы в массиве и передать его методу FindBand()
, который возвращает целое число, представляющее индекс полосы, содержащей значение.
Например:
public static int FindBand(double value, double[] bandLowerValues)
{
for (int i = 0; i < bandLowerValues.Length; ++i)
if (value < bandLowerValues[i])
return Math.Max(0, i-1);
return bandLowerValues.Length;
}
Тестовый код:
double[] bandLowerValues = {0, 1, 2, 5, 10};
Console.WriteLine(FindBand(-1, bandLowerValues));
Console.WriteLine(FindBand(0, bandLowerValues));
Console.WriteLine(FindBand(0.5, bandLowerValues));
Console.WriteLine(FindBand(1, bandLowerValues));
Console.WriteLine(FindBand(1.5, bandLowerValues));
Console.WriteLine(FindBand(2.5, bandLowerValues));
Console.WriteLine(FindBand(5, bandLowerValues));
Console.WriteLine(FindBand(8, bandLowerValues));
Console.WriteLine(FindBand(9.9, bandLowerValues));
Console.WriteLine(FindBand(10, bandLowerValues));
Console.WriteLine(FindBand(11, bandLowerValues));
Это не самый быстрый подход, если есть много полос, но если есть только несколько полос, этого, вероятно, будет достаточнобыстро.
(Если бы было много полос, вы могли бы использовать бинарный поиск, чтобы найти подходящую полосу, но, на мой взгляд, это было бы излишним).