Можно пример реального юз-кейза для этой штуки?
Как я понял, ищется индекс вставки для элемента в отсортированном списке, так?
Тогда:
0. Комментарии
// Returns the minimum index i in the range [0, list.Count — 1] such that list[i] > value — Upper
// Returns the minimum index i in the range [0, list.Count — 1] such that list[i] >= value — Lower
Вот фиг из них поймёшь, что имеется в виду. IndexOfFirstGreaterBy/IndexOfFirstGreaterByOrEqual тогда уж
1. Проблема с именем, будет путаница с Array.GetUpperBound()
2. Путаница с параметром
to. В дотнете принято делать пару startIndex + count (сколько элементов просматривать). Аля BinarySearch() / CopyTo() / Substring().
Ок, допустим неудобно настолько, что мы забиваем на least surprise. Зачем тогда
to может быть равен count?
это ж индекс типа. Я вот про это:
private static void ValidateIndicesRange(int from, int to, int count)
{
...
Code.AssertArgument(to <= count, nameof(to),
"The {0} index should not exceed the {1}", nameof(to), nameof(count));
...
}
3. Проблема с возвращаемым значением. Непонятно, найдено ли точное совпадение, или просто все предыдущие оказались меньше.
4. Выдаёт рандом на неотсортированных списках. Вот это для меня самый главный WTF.
И собственно вопрос: чем плох стандартный BinarySearch? С учётом стандартного трюка
var index = Array.BinarySearch(data.BinarySearch(2);
if (index < 0)
{
var insertIndex = ~index;
...
}
UPD и тот же вопрос — для EqualRange. Как часто нам нужен диапазон с-по для одного значения, не для valueFrom-valueTo?
UPD2 и для PartitionPoint — тож. Очень неочевидно, что у нас 4 метода по сути делают одно и то же, только с слегка разным поведением при сравнении.