Не удается отсортировать список определенным образом, используя функциональность OrderBy C # - PullRequest
0 голосов
/ 21 января 2019

РЕДАКТИРОВАТЬ - правильный результат справа (в примерах ниже) - это то, как Excel выполняет сортировку и чего я пытаюсь достичь с помощью OrderBy в C #.

Iиметь следующий оператор OrderBy:

tempList.OrderBy(x => x.value);

и получить следующие результаты:

01P
41
90

но мне нужно, чтобы вместо него было следующее:

41
90
01P

IsЕсть ли способ использовать OrderBy для выполнения этого типа сортировки?Я уже пытался добавить все варианты StringComparison (тип), но не смог заставить работать сортировку.

Любая помощь очень ценится!

Больше примеров ниже:

Sorted by OrderBy:                        What is needed instead:

Пример 1)

35                                        7
7                                         35

Пример 2)

44K                                       692
692                                       44K

Пример 3)

0EP                                       629
0ET                                       0EP
692                                       0ET

Пример 4)

10W                                       110
110                                       10W

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Хотя мне понравился ответ kkoyuncu, он опирается на два OrderBy. Вы можете устранить это, используя Custom Comparer.

public class CustomComparer : IComparer<string>
{
   public int Compare(string stringA, string stringB)
    {
        var isValueAInt = int.TryParse(stringA, out var valueA);
        var isValueBInt = int.TryParse(stringB, out var valueB);

        if(isValueAInt && isValueBInt)
        {
            return valueA - valueB;
        }
        else if(isValueAInt && !isValueBInt)
        {
            return-1;
        }
        else if(!isValueAInt && isValueBInt)
        {
            return 1;
        }
        return String.Compare(stringA,stringB);

    }
}

Теперь ваш код будет выглядеть так:

string[] myArray = { "35", "7","110","10W","0EP","0ET","692"};
var comparer = new CustomComparer();
var result = myArray.OrderBy(a=>a,comparer);

выход

7 
35 
110 
692 
0EP 
0ET 
10W 
0 голосов
/ 21 января 2019

Я думаю, что вы хотите числовую сортировку раньше. Попробуйте как ниже:

string[] myArray = { "0EP", "0ET", "692" };

var result = myArray.OrderBy(a => !int.TryParse(a, out var _)).ThenBy(a => a).ToList();
...