Re[2]: [CodeJam] UpperBound/LowerBound - оно чего вообще дел
От: Lexey Россия  
Дата: 20.07.16 09:50
Оценка: +1
Здравствуйте, 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) => Comparer<TValue>.Default.Compare(projection(item), value);
    var index = list.BinarySearch(value, comparer);
    if (index != list.Count)
    {
        result = list[index];
        return true;
    }
    result = default(T);
    return false;
}


И сразу видно минус твоего интерфейса — приходится внутри еще создавать дополнительный компаратор.
"Будь достоин победы" (c) 8th Wizard's rule.
Отредактировано 20.07.2016 10:21 Lexey . Предыдущая версия . Еще …
Отредактировано 20.07.2016 10:05 Lexey . Предыдущая версия .
Отредактировано 20.07.2016 10:04 Lexey . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.