none
OrderBy RRS feed

  • Вопрос

  • Hellow.

    I'm trying to sort list of string containing russian letters.

    I'm using metods list.Sort() and list.OrderBy().

    My problem is two strings - "й1" and "им". Sorting by ascending should returm "им","й1", because "и" before "й" in russian alphabet, but Sort() and OrderBy() return "й1","им". Why?

    P.S. Trying to sort this strings in Microsoft Excel. The result is the same.

    3 февраля 2015 г. 8:36

Ответы

  • Какие бы ни были заданы настройки операционной системы, в платформе .NET во всех методах, которые могут принимать культуру, по умолчанию используется CultureInfo.CurrentCulture - текущая культура пользователя. Так как у каждого пользователя она своя, то всяческие анализаторы кода обычно выдают предупреждения: укажите культуру явно.

    Я твёрдо это усвоил ещё давно, когда только начинал осваивать дотнет. В частности, из этой статьи: Многоликий класс CultureInfo. Хоть статья и старая, но рекомендую.

    Когда мы явно передаём в какой-либо метод культуру, то используется именно она и только она, невзирая на настройки ОС. Это аксиома! Иначе было бы невозможно создавать локализованный софт. Честно говоря, я в недоумении, почему это не работает.

    QazRdx, у меня в указанных вами настройках Format: Russian (Russia) и Location: Russia, всё остальное - English (United States). Но у меня ОС английская, так что всё верно.

    6 февраля 2015 г. 9:21

Все ответы

  • Letters "е" - "ё" and "и" - "й" are treated as equivalent.
    • Изменено Liliya Muray 3 февраля 2015 г. 9:04
    • Помечено в качестве ответа Margo214 3 февраля 2015 г. 9:06
    • Снята пометка об ответе Margo214 3 февраля 2015 г. 9:06
    3 февраля 2015 г. 9:03
  • I think about it, in the case of "е" - "ё" I agree, but I think if in russian  "и" - "й" completely different sorting should return correct result. Ok. Thank you for answer.
    3 февраля 2015 г. 9:15
  • I agree with you! But the development of VS and Office is not in Russia.
    3 февраля 2015 г. 9:19
  • Вот так новость.
    Действительно, сортирует некорректно,
    по вторым символам. а если они идентичны, то по третьим.
    Не важно, где это разрабатывают -
    должно работать.
    'и' - 232
    'й' - 233
    Должно сортировать, но не сортирует.
    Глюк!


    • Изменено QazRdx 3 февраля 2015 г. 10:44
    3 февраля 2015 г. 9:42
  • И куда жаловаться? )
    3 февраля 2015 г. 9:46
  • У меня сортирует правильно.

    Возможно, зависит от культуры, заданной по умолчанию.

    Чтобы работало правильно всегда, следует явно задавать культуру при сравнении и сортировке строк. Что-то вроде:

    list.Sort(StringComparer.Create(new CultureInfo("ru-Ru"), false));

    Также буквы "й" и "ё" могут задаваться не одним символом, а двумя, с использованием диакритического знака. Чтобы правильно сравнивать/сортировать строки с такими знаками, их следует нормализовать. Смотрите метод string.Normalize.
    3 февраля 2015 г. 10:29
  • Естественно, Обаме!
    Не Путину-же, в конце-то концов!
    Все на него повесили!
    Вообще интересно.
    Чисто алфавит сортируется правильно,
    причем не по численному значению символа,
    поскольку 'ё' вообще должна быть первой -
    'а' - 224, 'е' - 229, 'ё' - 184.
    Какая-то была хитрая кодировка,
    уплотняющая текст.
    Не помню, как называется.

    • Изменено QazRdx 3 февраля 2015 г. 10:41
    3 февраля 2015 г. 10:41
  • Petalvik
    А в Excel - е как ?
    И в c# предложенная Вами строка у меня не работает.

    List<string>	sL = new List<string>();
    sL.Add		("йа");
    sL.Add		("иб");
    sL.Add		("иа");
    sL.Sort		( StringComparer.Create	( new CultureInfo("ru-Ru"), false));
    После сортировки должно быть
    иа
    иб
    йа,
    а получается 
    иа
    йа
    иб
    • Изменено QazRdx 3 февраля 2015 г. 11:22
    3 февраля 2015 г. 10:56
  • Petalvik

    Возможно, я делаю что-то не так, но попробовала оба способа, все равно не помогло.

    • Изменено Margo214 3 февраля 2015 г. 11:20
    3 февраля 2015 г. 11:18
  • Гм, давайте разбираться.

    Если я задаю компаратор StringComparer.InvariantCulture или культуру new CultureInfo("en-US"), тогда сортирует неправильно.

    А если задаю "ru-RU" - всё в норме.

    Попробовал с разными версиями фреймворка, дебаг и релиз - везде одинаково. У меня Винда 8.1, английская, региональные настройки - Россия, русский язык.

    QazRdx, Margo214, что у вас выводит Console.WriteLine(CultureInfo.CurrentCulture); ? У меня "ru-RU", поэтому List.Sort() даже без указания компаратора сортирует правильно.

    3 февраля 2015 г. 11:53
  • У меня тоже "ru-RU". Винда 7, русская, региональные настройки - Россия, русский язык.
    3 февраля 2015 г. 12:04
  • Сорри! Отвлекся.

    Win7, VC# 2013

    Console.WriteLine ( CultureInfo.CurrentCulture);
    Console.ReadKey();
    sL = new List<string>();
    sL.Add ("йа");
    sL.Add ("иб");
    sL.Add ("иа");
    sL.Sort ();


    Печатает "ru-RU",
    Тем не менее сортирует неправильно

    Но даже если бы мои настройки были бы другими,
    следующий оператор должен был бы 
    временно поменять их на нужные, 
    но увы.

    sL.Sort ( StringComparer.Create ( new CultureInfo ( "ru-RU" ), false));

    И в Excel - е, кстати, тоже сортирует неправильно.


    • Изменено QazRdx 5 февраля 2015 г. 5:49
    5 февраля 2015 г. 0:38
  • Еще одна возможная причина -

    Start - ControlPanel - ClockLanguageRegion -
    - Region&Language - Administrative - CopySettings_Buton -
    Три Таблицы.

    В первой из них -

    Current user
    DisplayLanguage - English ???
    InputLanguage - Russian ( Russia ) - Russian
    Format - Russian ( Russia )

    В остальных - аналогично.

    Как исправить?
    Поискал, но не смог найти!

    • Изменено QazRdx 6 февраля 2015 г. 8:46
    6 февраля 2015 г. 8:43
  • Какие бы ни были заданы настройки операционной системы, в платформе .NET во всех методах, которые могут принимать культуру, по умолчанию используется CultureInfo.CurrentCulture - текущая культура пользователя. Так как у каждого пользователя она своя, то всяческие анализаторы кода обычно выдают предупреждения: укажите культуру явно.

    Я твёрдо это усвоил ещё давно, когда только начинал осваивать дотнет. В частности, из этой статьи: Многоликий класс CultureInfo. Хоть статья и старая, но рекомендую.

    Когда мы явно передаём в какой-либо метод культуру, то используется именно она и только она, невзирая на настройки ОС. Это аксиома! Иначе было бы невозможно создавать локализованный софт. Честно говоря, я в недоумении, почему это не работает.

    QazRdx, у меня в указанных вами настройках Format: Russian (Russia) и Location: Russia, всё остальное - English (United States). Но у меня ОС английская, так что всё верно.

    6 февраля 2015 г. 9:21
  • То-то и оно!

    6 февраля 2015 г. 9:39