Почему некоторые списки кортежей отсортированы, а другие нет?

Мне нужно отсортировать 28 Tuple. Символы в AZ, "+", "*".

Порядок ASCII: *, +, A...Z, и я хочу получить этот порядок: A...Z, +, *.

Для этого я использую этот Comparer:

public class AlphabeticPaginationComparer : IComparer<Tuple<char, int>>
{
    public int Compare(Tuple<char, int> a, Tuple<char, int> b)
    {
        // '*' is greater than all letters and '+',
        if (a.Item1 == '*')
        {
            return 1;
        }

        if (b.Item1 == '*')
        {
            return -1;
        }

        // '+' is greater than all letters
        if (a.Item1 == '+')
        {
            return 1;
        }

        if (b.Item1 == '+')
        {
            return -1;
        }

        // Finally we compare letters normally
        return a.Item1 - b.Item1;
    }
}

Вот мой код:

IOrderedEnumerable<Tuple<char, int>> orderedList = 
    origList.OrderBy(c => c, new AlphabeticPaginationComparer());

List<Tuple<char, int>> orderedList2 = orderedList.ToList();

Этот список отсортирован

List<Tuple<char, int>> origList = new List<Tuple<char, int>>
{
    Tuple.Create('L', 15),
    Tuple.Create('R', 12),
    Tuple.Create('E', 3),
    Tuple.Create('P', 9),
    Tuple.Create('B', 30),
    Tuple.Create('C', 13),
    Tuple.Create('M', 11),
    Tuple.Create('A', 5),
    Tuple.Create('V', 5),
    Tuple.Create('H', 6),
    Tuple.Create('S', 5),
    Tuple.Create('G', 15),
    Tuple.Create('T', 8),
    Tuple.Create('D', 15),
    Tuple.Create('K', 4),
    Tuple.Create('I', 2),
    Tuple.Create('F', 7),
    Tuple.Create('W', 3),
    Tuple.Create('+', 6),
    Tuple.Create('O', 1),
    Tuple.Create('Z', 1),
    Tuple.Create('J', 0),
    Tuple.Create('N', 0),
    Tuple.Create('Q', 0),
    Tuple.Create('U', 0),
    Tuple.Create('X', 0),
    Tuple.Create('Y', 0),
    Tuple.Create('*', 176)
};

но не этот, программа висит на.ToList().

List<Tuple<char, int>> origList = new List<Tuple<char, int>>
{
    Tuple.Create('A', 70),
    Tuple.Create('C', 119),
    Tuple.Create('B', 27),
    Tuple.Create('G', 39),
    Tuple.Create('D', 22),
    Tuple.Create('E', 21),
    Tuple.Create('F', 20),
    Tuple.Create('I', 25),
    Tuple.Create('H', 14),
    Tuple.Create('J', 4),
    Tuple.Create('K', 9),
    Tuple.Create('L', 24),
    Tuple.Create('M', 50),
    Tuple.Create('N', 5),
    Tuple.Create('O', 15),
    Tuple.Create('P', 17),
    Tuple.Create('R', 12),
    Tuple.Create('S', 68),
    Tuple.Create('T', 18),
    Tuple.Create('U', 12),
    Tuple.Create('V', 19),
    Tuple.Create('W', 5),
    Tuple.Create('X', 1),
    Tuple.Create('Y', 1),
    Tuple.Create('+', 1),
    Tuple.Create('Q', 0),
    Tuple.Create('Z', 0),
    Tuple.Create('*', 618)
};

Я пробовал со случайными списками, и эта проблема также кажется случайной.

Любая помощь будет приветствоваться.

1 ответ

Решение

Что происходит, когда a.Item1 является + а также b.Item1 это также +? You need to return 0, not 1 because they are equal.

Вот как вы можете это исправить:

public class AlphabeticPaginationComparer : IComparer<Tuple<char, int>>
{
    public int Compare(Tuple<char, int> a, Tuple<char, int> b)
    {
        if (a.Item1 == b.Item1)
            return 0;

        //...
    }
}
Другие вопросы по тегам