C# 为什么对一些元组列表进行排序,而对其他元组列表不进行排序?

C# 为什么对一些元组列表进行排序,而对其他元组列表不进行排序?,c#,linq,icomparer,C#,Linq,Icomparer,我需要对28元组进行排序。字符在A-Z、“+”、“*”中 ASCII顺序是:*,+,A…Z,我想得到这个顺序:A…Z,+,* 为此,我使用此比较器: public class AlphabeticPaginationComparer : IComparer<Tuple<char, int>> { public int Compare(Tuple<char, int> a, Tuple<char, int> b) {

我需要对28元组进行排序。字符在A-Z、“+”、“*”中

ASCII顺序是:*,+,A…Z,我想得到这个顺序:A…Z,+,*

为此,我使用此比较器:

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;
    }
}
公共类AlphaccPaginationComparer:IComparer
{
公共整数比较(元组a、元组b)
{
//“*”大于所有字母和“+”,
如果(a.Item1=='*')
{
返回1;
}
如果(b.Item1=='*')
{
返回-1;
}
//“+”大于所有字母
如果(a.Item1=='+')
{
返回1;
}
如果(b.Item1=='+')
{
返回-1;
}
//最后,我们通常比较字母
返回a.Item1-b.Item1;
}
}
这是我的密码:

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

List<Tuple<char, int>> orderedList2 = orderedList.ToList();
IOrderedEnumerable orderedList=
OrderBy(c=>c,新的字母拼音比较器());
List 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)
};
List origList=新列表
{
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 origList=新列表
{
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)
};
我尝试了随机列表,这个问题似乎也是随机的


欢迎任何帮助。

a.Item1
+
并且
b.Item1
也是
+
时会发生什么?您需要返回0,而不是1,因为它们相等

以下是解决此问题的方法:

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;

        //...
    }
}
公共类AlphaccPaginationComparer:IComparer
{
公共整数比较(元组a、元组b)
{
如果(a.Item1==b.Item1)
返回0;
//...
}
}

理想情况下,您是对的,但这些列表来自一个GroupBy,字符上不能有重复项。哦,你说得对。我不明白为什么我的程序只是偶尔运行。@D.Lucazeau,出于某种原因,LINQ试图将
(“+”,1)
与自身进行比较(我不确定为什么),它得到了一个1,而它应该得到一个0。您已经解决了我的问题。Thanks@YacoubMassadlinq排序例程偶尔会将一个项与自身进行比较,因此,即使集合具有唯一的项,如果这两个值与您一样“相等”,您仍然需要返回0。您没有遵循IComparer的规则,因为顺序必须是确定的。您的实现不是确定性的,因为处理
+
*
的逻辑在这两项都是
+
*
时无法处理。这种不确定性可能导致.NET排序代码中出现无限循环。
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;

        //...
    }
}