Является ли StringComparer.CurrentCulture правильным выбором для использования в этом случае? - PullRequest
3 голосов
/ 07 января 2010

У меня есть список строк UTF-8, которые я хочу отсортировать, используя Enumerable.OrderBy . Строки могут содержать любое количество наборов символов - например, английский, немецкий и японский, или даже их сочетание.

Например, вот примерный список ввода:

["東京","North 東京", "München", "New York", "Chicago", "大阪市"]

Я не совсем понимаю, является ли использование StringComparer.CurrentCulture правильным параметром сравнения строк для передачи OrderBy(). Что, если текущая культура приложения en-US, но я все еще хочу сортировать данные UTF-8 "правильно", помимо en-US правил сортировки?

Моя путаница, вероятно, связана с моим пониманием функции NLSSORT в Oracle, которая не совсем соответствует семантике сравнения и сортировки строк .NET. Например, установка NLS_SORT = Japanese_M означает, что он будет правильно сортировать латиницу, западноевропейский и японский языки независимо от того, встречается ли какой-либо или все символы в данной строке в столбце сортировки.

Ответы [ 2 ]

4 голосов
/ 07 января 2010

Нет единого сравнения, которое бы работало для всех культур.

За исключением определения языка и соответствующего выбора, InvariantCulture - ваш лучший выбор. В качестве документа вы ссылаетесь на примечания:

НЕ: используйте строковые операции на основе StringComparison.InvariantCulture в большинстве случаев; Одним из немногих исключений будет сохранение лингвистически значимых, но культурно-независимых данных.

Я добавил акцент. Это исключение более или менее то, что вы делаете.

1 голос
/ 07 января 2010

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

...