2013-03-22 2 views
0

Кто-нибудь знает, как я могу отсортировать список строк в C# в точно таком же порядке, который будет возвращен SQLite-запросом, в том числе для всех специальных символов. Мне нужно выполнить двоичный поиск возвращаемых данных, однако мой IComparer использует C# 'String's CompareOrdinal и поэтому не работает, поскольку порядок сортировки между ними отличается.Сортировка списка строк в C# в том же порядке, что и SQLite

Я определил столбец таблицы SQlite как «collate nocase».

ответ

0

Чтобы перефразировать вопрос, как вы можете отсортировать список строк, игнорируя регистр?

Класс StringComparer обеспечивает сопоставители, которые поддерживают определенную культуру и могут опционально игнорировать регистр. Для сортировки, используя текущую культуру вашей нити можно использовать CurrentCultureIgnoreCase компаратор:

var myList=new List<string>{"aa2","Aa1"}; 
myList.Sort(StringComparer.CurrentCultureIgnoreCase); 

В компараторов InvariantCultureIgnoreCase или OrdinalIgnoreCase использовать инвариантные и порядковые сравнения соответственно.

SQLite по умолчанию использует двоичное объединение, которое эквивалентно Порядковый (пункт 6.1 из DataTypes in SQLite v3:

Every column of every table has an associated collating function. If no collating function is explicitly defined, then the collating function defaults to BINARY

Если вы не изменили параметры сортировки таблиц, вы можете использовать OrdinalIgnoreCase для сортировки в том же заказ без учета регистра.

Вы также можете создать компаратор для конкретной культуры с методом StringComparer.Create.

+0

No. SQLite не знает текущую культуру , Он также, я думаю, подчиняется некоторому стандарту для сортировки строк UTF. «NOCASE - сравнивает символы ASCII с учетом регистра, а другие обрабатываются как байты». Не уверен, что это то же самое, что и C# CompareOrdinalIgnoreCase .. –

+0

Не совсем. SQLite по умолчанию использует двоичную сортировку, что эквивалентно Ordinal. Он просто сравнивает значения байтов –

Смежные вопросы