为什么-9 被认为大于 1?

Why is -9 considered bigger than 1?

我的数据集是:

Name                        Order        ID 
Summary                     1            147
Software Functionality     -9            211

我有这个 LINQ 查询:

string value = projectA.OrderByDescending(a => a.Order)
                       .ThenBy(a => a.Name)
                       .ToList()
                       .First()
                       .ID
                       .ToString();

我得到的答案是211,但我认为答案应该是147,为什么会这样?

注意:Order 字段的类型为 string

我试图重建你的问题。这是我的代码 (LinqPad),它可以正常工作:

void Main()
{
    List<ProgramA> progs = new List<ProgramA>{
        new ProgramA("Summary", 1, 147),
        new ProgramA("Software Functionality", -9, 211)
        };

    int value= progs.OrderByDescending(a => a.Order).ThenBy(a => a.Name).ToList().First().ID;

    value.Dump();

}

// Define other methods and classes here
class ProgramA
{
    private string sName = string.Empty;
    private int iOrder = 0;
    private int iID = 0;

    public ProgramA(string _Name, int _Order, int _ID)
    {
        sName = _Name;
        iOrder = _Order;
        iID = _ID;
    }

    public string Name
    {
        get {return sName;}
        set {sName = value;}
    }

    public int Order
    {
        get {return iOrder;}
        set {iOrder = value;}
    }

    public int ID
    {
        get {return iID;}
        set {iID = value;}
    }
}

returns: 147

[编辑]

@DStanley 它在列表中存储为“1”和“-9” – user1989 6 分钟前

如果订单存储为字符串值,您可以尝试将其转换为整数:

    int value= progs.OrderByDescending(a => Convert.ToInt32(a.Order)).ThenBy(a => a.Name).ToList().First().ID;

您得到了您的输出,因为您的 Orderstring。作为证明,此示例将显示当它是整数时您会得到正确的输出:

void Main()
{
    var list = new List<Project>() { new Project() { Order = 1, Id = 147, Name = "Summary" }, new Project() { Order = -9, Id = 211, Name = "Software Functionality" } };
    int value= list.OrderByDescending(a => a.Order).ThenBy(a => a.Name).ToList().First().Id;
    Console.WriteLine (value);
}

public class Project 
{
    public int Order {get;set;}
    public int Id {get;set;}
    public string Name {get;set;}
}

However, in case you do need it as a string: why doesn't it work like this?

看看 CompareOptions 枚举。更具体地说:CompareOptions.IgnoreSymbols

Indicates that the string comparison must ignore symbols, such as white-space characters, punctuation, currency symbols, the percent sign, mathematical symbols, the ampersand, and so on. This is also explained here.

这基本上使您的 -9 成为 9

您可以通过创建自己的比较器并传递您需要的内容来轻松绕过此问题:

public class CustomComparer : IComparer<string>
{
    public int Compare(string x,string y)
    {
        return CultureInfo.CurrentCulture.CompareInfo.Compare(x, y, CompareOptions.Ordinal);
    }
}

可以用作

new[] {"1", "-9"}.OrderByDescending(x => x, new CustomComparer())

字符串值= projectA.OrderByDescending(a => a.Order).ThenBy(a => a.Name).ToList().First().ID.ToString( );

OrderByDescending => 订单 输出 - -9, 1

Select 第一个元素 - 9 = 211。逻辑正确。