Сообщение Re[7]: BinarySearch со значением поля на входе от 31.03.2025 11:02
Изменено 01.04.2025 11:27 VladD2
Re[7]: BinarySearch со значением поля на входе
Здравствуйте, m2user, Вы писали:
M>Можно написать свою, а можно взять ArrayList.Adapter, как я предлагаю выше.
M>Однако это не является достаточным для решения задачи ТС.
M>Т.к. ему нужно искать по значению поля (T value у него нет)
Ну это просто мне было влом самому писать, а ИИ тупанул чутка. Без параметра легко можно обойтись:
public static int BinarySearch<T>(this IList<T> list, Func<T, int> comparer)
{
var left = 0;
var right = list.Count — 1;
while (left <= right)
{
var mid = left + (right — left) / 2;
var cmp = comparer(list[mid]);
if (cmp == 0)
return mid;
if (cmp < 0)
right = mid — 1;
else
left = mid + 1;
}
return ~left; // индекс вставки с битовым дополнением
}
M>А значит в любом случае нужна какая-то обертка над T или IList<T> ("овердизайн"), либо хитрый comparer ("костыли").
Думать немножко надо.
M>Можно написать свою, а можно взять ArrayList.Adapter, как я предлагаю выше.
M>Однако это не является достаточным для решения задачи ТС.
M>Т.к. ему нужно искать по значению поля (T value у него нет)
Ну это просто мне было влом самому писать, а ИИ тупанул чутка. Без параметра легко можно обойтись:
public static int BinarySearch<T>(this IList<T> list, Func<T, int> comparer)
{
var left = 0;
var right = list.Count — 1;
while (left <= right)
{
var mid = left + (right — left) / 2;
var cmp = comparer(list[mid]);
if (cmp == 0)
return mid;
if (cmp < 0)
right = mid — 1;
else
left = mid + 1;
}
return ~left; // индекс вставки с битовым дополнением
}
M>А значит в любом случае нужна какая-то обертка над T или IList<T> ("овердизайн"), либо хитрый comparer ("костыли").
Думать немножко надо.
Re[7]: BinarySearch со значением поля на входе
Здравствуйте, m2user, Вы писали:
M>Можно написать свою, а можно взять ArrayList.Adapter, как я предлагаю выше.
M>Однако это не является достаточным для решения задачи ТС.
M>Т.к. ему нужно искать по значению поля (T value у него нет)
Ну это просто мне было влом самому писать, а ИИ тупанул чутка. Без параметра легко можно обойтись:
M>А значит в любом случае нужна какая-то обертка над T или IList<T> ("овердизайн"), либо хитрый comparer ("костыли").
Думать немножко надо.
M>Можно написать свою, а можно взять ArrayList.Adapter, как я предлагаю выше.
M>Однако это не является достаточным для решения задачи ТС.
M>Т.к. ему нужно искать по значению поля (T value у него нет)
Ну это просто мне было влом самому писать, а ИИ тупанул чутка. Без параметра легко можно обойтись:
public static int BinarySearch<T>(this IList<T> list, Func<T, int> comparer)
{
var left = 0;
var right = list.Count - 1;
while (left <= right)
{
var mid = left + (right - left) / 2;
var cmp = comparer(list[mid]);
if (cmp == 0)
return mid;
if (cmp < 0)
right = mid - 1;
else
left = mid + 1;
}
return ~left; // индекс вставки с битовым дополнением
}M>А значит в любом случае нужна какая-то обертка над T или IList<T> ("овердизайн"), либо хитрый comparer ("костыли").
Думать немножко надо.