Информация об изменениях

Сообщение Re[2]: [CodeJam] UpperBound/LowerBound - оно чего вообще дел от 20.07.2016 9:50

Изменено 20.07.2016 10:04 Lexey

Здравствуйте, Jack128, Вы писали:

А нужен? Он тривиально реализуется через LowerBound:
var comparer = (item, id) => item.ID - id;
var index = items.LowerBound(10, comparer);
if (index != items.Count && items[index].ID == 10)
{
    // есть значение
}
else
{
    // нет значения
}


Я посчитал, что городить еще одну функцию смысла нет, тем более, что мне чистый бинарный поиск нужен крайне редко. Гораздо чаще нужен поиск элемента или позиции вставки в одном флаконе.

J>нема? Имхо намного полезнее всяких LowerBound и ежи с ними.


Кому как.
Здравствуйте, Jack128, Вы писали:

А нужен? Он тривиально реализуется через LowerBound:
var comparer = (item, id) => item.ID - id;
var index = items.LowerBound(10, comparer);
if (index != items.Count && items[index].ID == 10)
{
    // есть значение
}
else
{
    // нет значения
}


Я посчитал, что городить еще одну функцию смысла нет, тем более, что мне чистый бинарный поиск нужен крайне редко. Гораздо чаще нужен поиск элемента или позиции вставки в одном флаконе.

J>нема? Имхо намного полезнее всяких LowerBound и ежи с ними.


У меня другое ИМХО.

Но, если хочется, то нет проблем добавить и бинарный поиск в исходном стиле:
public static int BinarySearch<T,TValue>(this IList<T> list, TValue value, Func<T, TValue, int> comparer);


Твой Try... через него потом делается с полпинка:
public static bool TryBinarySearch<T,TValue>(this IList<T> list, Func<T, TValue> projection, TValue value, out T result)
{
    var comparer = (item, value) => projection(item) - value;
    var index = list.BinarySearch(value, projection comparer);
    if (index != list.Count)
    {
        result = list[index];
        return true;
    }
    result = default(T);
    return false;
}


И сразу видно минус твоего интерфейса — приходится внутри еще создавать дополнительный компаратор.