Как отсортировать буквенно-цифровую строку со специальными символами в С# с помощью Linq?

Как отсортировать буквенно-цифровую строку со специальными символами в С# с помощью Linq? Порядок должен быть сначала специальными символами, затем числами и затем алфавитами.

Пример :

Введите здесь описание изображения

Метод Sort возвращает желаемый результат... а не ожидаемый, который кажется неправильным; не могли бы вы добавить реальный код или хотя бы реальные данные?

Salvatore Giuffrida 20.11.2022 16:51

Klaus Gütter 20.11.2022 17:04

@KlausGütter Никаких особых требований к специальным символам. порядок должен быть сначала специальными символами, затем числами и затем алфавитами. Спасибо.

vivek 20.11.2022 17:08

Тогда input.OrderBy(x => x) вполне нормально.

Klaus Gütter 20.11.2022 17:09

@KlausGütter Я попробовал input.OrderBy(x => x) результат, который я прикрепил выше, когда я нажимаю на столбец для сортировки по убыванию

vivek 20.11.2022 17:11

Лучше добавить это как текст, а не как изображение. Ваш результат, кажется, использует другой ввод, чем пример в вашем вопросе, верно?

Klaus Gütter 20.11.2022 17:16

Да, это другой пример

vivek 20.11.2022 17:33
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
7
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать пользовательскую реализацию IComparer, а затем передать ее в вызов OrderBy. Например.:

public class SpecialCharactersNumbersLettersComparer : IComparer<string>
{
    private readonly IComparer<string> defaultComparer = StringComparer.InvariantCulture;
    
    private static int OrderOfChar(char ch)
    {
        if (Char.IsLetter(ch))
            return 2;
        if (Char.IsDigit(ch))
            return 1;
        return 0;
    }
    
    public int Compare(string left, string right)
    {
        if (string.IsNullOrEmpty(left)
          || string.IsNullOrEmpty(right)) {
            return defaultComparer.Compare(left, right);
        }
        
        var leftChar = left[0];
        var rightChar = right[0];
        var leftOrder = OrderOfChar(leftChar);
        var rightOrder = OrderOfChar(rightChar);
        
        if (leftOrder == rightOrder)
            return defaultComparer.Compare(left, right);
        
        if (leftOrder > rightOrder)
            return 1;
        return -1;
    }
}

public static List<string> SortSpecialCharactersNumbersAlphabet(IEnumerable<string> input)
{
    return input.OrderBy(_ => _, new SpecialCharactersNumbersLettersComparer())
        .ToList();
}

Используется как:

Console.WriteLine(string.Join(", ",
    SortSpecialCharactersNumbersAlphabet(new [] {
    "Hello", "#Test", "@Red", "&While", "123@Test", "@123Test", "%54Sun", "Dom", "Left"})));

Производит вывод:

@123Test, @Red, &While, #Test, %54Sun, 123@Test, Dom, Hello, Left

Поскольку стандартное сравнение строк делает именно это, вы можете просто использовать OrderBy:

var input = new[] { "Hello", "#Test", "@Red", "&While", "123@Test", "@123Test", "%54Sun", "Dom", "Left" };
foreach (var s in input.OrderBy(x => x)) Console.WriteLine(s);

Дает:

@123Test
@Red
&While
#Test
%54Sun
123@Test
Dom
Hello
Left

Поскольку сравнение строк зависит от культуры, это может отличаться в зависимости от вашей текущей культуры. Если вы хотите, чтобы он не зависел от культуры, используйте, например. OrderBy(x => x, StringComparer.InvariantCulture).

Это не работает, когда я хочу отсортировать столбец вручную. Он работает только один раз при загрузке пользовательского интерфейса.

vivek 20.11.2022 18:12

Вы имеете в виду в DataGridView или подобном? Что именно вы делаете для его сортировки и каков результат?

Klaus Gütter 20.11.2022 19:48

Да, это DataGridView, и я пытаюсь отсортировать, щелкнув столбец

vivek 21.11.2022 16:05

Но это действительно что-то другое сейчас. Мэйб задать новый вопрос для этого.

Klaus Gütter 21.11.2022 17:55

Другие вопросы по теме