Почему некоторые списки кортежей отсортированы, а другие нет?
Мне нужно отсортировать 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;
//...
}
}