Это действительно должно быть (low+high)//2
. Как и сейчас, mid
начинается с последнего элемента в списке и всегда проходит через остальную часть условия guess>item
. Таким образом, high
уменьшается на 1 каждый раз, а low
никогда не меняется (с нуля). Процесс заканчивается тем, что проходит все элементы от последнего к первому, что вовсе не является двоичным поиском (скорее, последовательным поиском).
Вы сможете добиться этого, заказав проекцию, которая нормализует ситуацию для вас. Например, в Oracle есть «нижняя» функция, которая переводит строковые типы данных в нижний регистр, такие как varchar2 и nvarchar2; поэтому я буду использовать эту функцию sql, чтобы сформировать проекцию, которая будет упорядочена соответствующим образом.
var projection = Projections.SqlFunction("lower", NHibernateUtil.String, Projections.Property("Name")); var x = SomeCriteria.AddOrder(Orders.Asc(projection)).List()
Если вы используете SQL Server, для повышения эффективности я бы рекомендовал использовать функцию «верхний» вместо «нижний». Microsoft оптимизировала свой собственный код для выполнения сравнения в верхнем регистре, тогда как остальной мир, похоже, оптимизировал для нижнего регистра.
В Hibernate (Java) есть метод ignoreCase () для класса "Order", но он выглядит как NHibernate этот метод не указан в его «Порядке».
Вот как я думал, вы могли бы это сделать:
var x = SomeCriteria.AddOrder(new Order("Name", true).IgnoreCase()).List();
Но, к сожалению, IgnoreCase () не существует.
В качестве обходного пути вы можете использовать HQL или SQL-запрос - любой из них должен позволять упорядочивать без учета регистра.
Это, вероятно, зависит от настройки чувствительности к регистру на вашем сервере базы данных. Я подозреваю, что NHibernate просто выдает предложение "ORDER BY"; по крайней мере, я не могу себе представить, что еще он будет делать. Для SQL Server по умолчанию порядок сортировки (сортировка) является словарным, без учета регистра.
В этой статье приводятся некоторые методы выполнения поиска с учетом регистра в SQL Server. Однако мой совет - сортировать список, возвращаемый запросом в коде. Это решение сохраняет независимость от базы данных NHibernate и позволяет настраивать порядок сортировки в соответствии с вашими потребностями.
Поскольку я знаю, что ответы на мой запрос всегда довольно малы, я закончил тем, что запрашивал данные как обычно и сортировал их впоследствии используя Linq. Это работает, так что зачем настраивать NHibernate;) (Использование SQLite, кстати)