Сортировка от буквенно-цифровых к не алфавитно-цифровым - PullRequest
5 голосов
/ 07 апреля 2011

У меня есть массив данных:

!
A
B
E
$
N

Я бы хотел, чтобы он был отсортирован от буквенно-цифрового к не буквенно-цифровому.

Пример: A B E N ! $

Как бы я это сделал?

Ответы [ 4 ]

3 голосов
/ 07 апреля 2011

Этого можно достичь с помощью комбинации методов расширения OrderBy и ThenBy :

char[] data = { 'E', 'B', '$', 'N', '!', 'A' };
var query = data.OrderByDescending(c => char.IsLetter(c))
                .ThenBy(c => c);
3 голосов
/ 07 апреля 2011
char[] yourOriginalValues = new [] { '!', 'A', 'B', 'E', '$', 'N' };

IEnumerable<char> result = 
       yourOriginalValues.Where(c => Char.IsLetterOrDigit(c))
            .OrderBy(c => c)
            .Concat(yourOriginalValues.Where(c => !Char.IsLetterOrDigit(c)));

Это, кажется, дает значения, которые вы ищете.

1 голос
/ 07 апреля 2011

Если вы хотите иметь индивидуальный порядок сортировки, вам нужно предоставить собственную функцию сравнения. В вашем случае (буквы + цифры сначала, остальные позже) вы можете использовать что-то вроде

var data = "!ABE$N".ToCharArray().ToList();
data.Sort((x, y) => {
    if (x == y) return 0;
    if (Char.IsLetterOrDigit(x))
    {
        if (!Char.IsLetterOrDigit(y)) return -1;
        return x < y ? -1 : +1;
    }
    else
    {
        if (Char.IsLetterOrDigit(y)) return +1;
        return x < y ? -1 : +1;
    }
});

Добавлено за комментарий: то же самое, только с другим синтаксисом (с использованием простого старого метода):

int MyComparisonFunction(char x, char y)
{
    if (x == y) return 0;
    if (Char.IsLetterOrDigit(x))
    {
        if (!Char.IsLetterOrDigit(y)) return -1;
        return x < y ? -1 : +1;
    }
    else
    {
        if (Char.IsLetterOrDigit(y)) return +1;
        return x < y ? -1 : +1;
    }
}

// ...

var data = "!ABE$N".ToCharArray().ToList();
data.Sort(MyComparisonFunction);

То же самое в другом стиле - создать реализацию IComparer и использовать ее. Это полезно, если порядок сортировки следует использовать в большем количестве мест, во многих коллекциях и элементах управления есть свойство IComparer для переопределения порядка сортировки:

public class AlphabeticPriorToNonalphabeticComparer : IComparer<char>
{
    public int Compare(char x, char y)
    {
        if (x == y) return 0;
        if (Char.IsLetterOrDigit(x))
        {
            if (!Char.IsLetterOrDigit(y)) return -1;
            return x < y ? -1 : +1;
        }
        else
        {
            if (Char.IsLetterOrDigit(y)) return +1;
            return x < y ? -1 : +1;
        }
    }
}
// ...
var data = "!ABE$N".ToCharArray().ToList();
var myComparer = new AlphabeticPriorToNonalphabeticComparer();
data.Sort(myComparer);
0 голосов
/ 07 апреля 2011
myArray.Sort();

Это будет использовать сортировку по умолчанию, алфавитный (не числовой) сортировки.Это должно сработать или я что-то упустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...