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