2015-01-20 80 views
0

数据集我是:为什么-9认为大于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

+4

'Order'是数字还是字符串类型? – 2015-01-20 21:08:10

+0

我觉得''是'chr(45)'没关系。 – 2015-01-20 21:11:15

+0

对不起,只是复制粘贴错误,它是一个字符串。 – user1989 2015-01-20 21:33:06

回答

3

你得到你,因为你的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;} 
} 

但是,如果你确实需要它作为一个字符串:为什么没有这样的工作?

查看CompareOptions enum。更具体地说:CompareOptions.IgnoreSymbols

指示字符串比较必须忽略符号,如空格字符,标点,货币符号,百分号,数学符号,连字符,等等。这也被解释为here

这实质上使得你的 a 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()) 
+0

注意:我没有时间搜索默认使用'CompareOptions'的内容,因此可以在答案中随意编辑它。 – 2015-01-20 21:46:59

-1

我试图重建你的问题。这里是我的代码(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;} 
    } 
} 

回报:

[编辑]

@DStanley它存储为 “1” 和“ - 9“中的用户 - user1989 6分钟前

如果订单存储为字符串值,你可以尝试把它转换成整数:

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

因为它不回答问题并且不会复制问题。他的'Order'字段的类型是'string'。 – 2015-01-20 21:45:14

+0

OP的关于* Order *的评论字段是我写回答时添加的一个字符串值。请在编辑后查看我的答案。 – 2015-01-20 21:48:10

+0

@JeroenVannevel,为什么你的回答比我的好?你提供了和我一样的解决方案!顺便说一句:在同一时间! – 2015-01-20 21:50:54

-3

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

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

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