Давайте начнем с этой перегрузки списка BinarySearch:
public int BinarySearch(T item, IComparer<T> comparer);
Хорошо известно, что список должен быть отсортирован с соответствующим IComparer перед использованием BinarySearch. Но тогда: для поиска списка вам нужно будет указать элемент Т. Это довольно неожиданно, когда используется для поиска элементов в списке на основе свойств этих элементов (например, с использованием Linq или делегатов/предикатов). Потому что, когда у меня уже есть свой элемент Т, мне не нужно его искать!
Теперь я реализовал код С++ на С# и увидел, что программист на С++ использовал бинарные поиски в стиле С++ везде в своем коде следующим образом. Сначала он сделал новый элемент Т и дал этому элементу Т свойства, которые он искал. Затем он просмотрел список с ним, чтобы найти индекс элемента в списке с теми же свойствами. Конечно, С++-сопоставитель был адаптирован к этим свойствам.
Итак, это совсем другой способ поиска элементов в списке. BinarySearch создает фиктивный элемент T и ищет индекс, с помощью которого он может получить реальный элемент T в списке. С точки зрения Linq это кажется неестественным.
Мои вопросы:
Я дал правильное описание идеи BinarySearch?
Как вы думаете, можно ли использовать поиск стиля Linq с BinarySearch, не делая сначала фиктивный элемент T?