2015-01-20 73 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邏輯是正確的。