Как отсортировать буквенно-цифровую строку со специальными символами в С# с помощью Linq? Порядок должен быть сначала специальными символами, затем числами и затем алфавитами.
Пример :
Ввод — {Привет, #Test, @Red, &While, 123@Test, @123Test, %54Sun, Dom, Left}
Ожидается - { @123Test, %54Sun, @Red, #Test, &While, 123@Test, Dom, Hello, Left}
Есть какие-то особые требования к тому, как сделать заказ со специальными символами? Стандартная функция заказа дает: "@123Test", "@Red", "&While", "#Test", "%54Sun", "123@Test", "Дом", "Hello", "Left".
@KlausGütter Никаких особых требований к специальным символам. порядок должен быть сначала специальными символами, затем числами и затем алфавитами. Спасибо.
Тогда input.OrderBy(x => x)
вполне нормально.
@KlausGütter Я попробовал input.OrderBy(x => x) результат, который я прикрепил выше, когда я нажимаю на столбец для сортировки по убыванию
Лучше добавить это как текст, а не как изображение. Ваш результат, кажется, использует другой ввод, чем пример в вашем вопросе, верно?
Да, это другой пример
Вы можете использовать пользовательскую реализацию 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)
.
Это не работает, когда я хочу отсортировать столбец вручную. Он работает только один раз при загрузке пользовательского интерфейса.
Вы имеете в виду в DataGridView или подобном? Что именно вы делаете для его сортировки и каков результат?
Да, это DataGridView, и я пытаюсь отсортировать, щелкнув столбец
Но это действительно что-то другое сейчас. Мэйб задать новый вопрос для этого.
Метод Sort возвращает желаемый результат... а не ожидаемый, который кажется неправильным; не могли бы вы добавить реальный код или хотя бы реальные данные?