Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么-9被认为大于1?_C#_Linq - Fatal编程技术网

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

C# 为什么-9被认为大于1?,c#,linq,C#,Linq,我拥有的数据集是: Name Order ID Summary 1 147 Software Functionality -9 211 我有一个LINQ查询: string value = projectA.OrderByDescending(a => a.Order) .ThenBy(a

我拥有的数据集是:

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;}
    }
}

因为您的
订单
是一个
字符串
,所以您得到了所拥有的输出。作为证明,此示例将显示,当它是整数时,您将获得正确的输出:

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;}
}
可以用作

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

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

OrderByDescending=>Orders 产出——9,1

选择第一个元素
- 9 = 211. 逻辑是正确的

Order
是数字类型还是字符串类型?我认为这并不重要,因为
-
chr(45)
。抱歉,只是复制粘贴错误,它是字符串。@DStanley它在列表中存储为“1”和“-9”。正如胡安·洛佩斯所暗示的,快速查看显示“-”在“1”之前。因此,ASCII排序顺序在“1”之前有“-9”,因为它不回答问题,也不复制问题。他的
Order
字段的类型为
string
。OP关于Order字段的注释是一个字符串值,在我写答案时已添加。请在编辑后查看我的答案。@Jeroenvanevel,那么为什么你的答案比我的好呢?你提供了和我一样的解决方案!顺便说一句:同时!注意:我没有时间搜索默认使用的
比较选项
,所以请在答案中自由编辑。
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())