2015-01-20 3 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' числовым или строковым типом? –

+0

Я думаю, это не имеет значения, так как '-'' 'chr (45)'. –

+0

Извините, просто скопируйте ошибку, это строка. – user1989

ответ

3

Вы получаете вывод, который вы имеете, потому что ваш Order является string. В качестве доказательства, этот пример показывает, что вы получите правильный выход, когда это целое число:

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. Более конкретно: 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» по умолчанию, поэтому не стесняйтесь редактировать его в ответе. –

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

возвращается:

[EDIT]

@DStanley Он хранится как "1" и «- 9 "в списке - user1989 6 мин. Назад

Если Заказ хранится как строковое значение, вы можете попытаться преобразовать его в целое число:

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

Потому что он не отвечает на вопрос и не реплицирует проблему. Его поле 'Order' имеет тип' string'. –

+0

Комментарий OP о поле * Order * - это строковое значение, добавленное, когда я написал свой ответ. Пожалуйста, см. Мой ответ после редактирования. –

+0

@JeroenVannevel, так почему ваш ответ лучше моего? Вы предоставили такое же решение, как и мое! Кстати: в то же время! –

-3

строкового значения = projectA.OrderByDescending (а => a.Order) .ThenBy (a => a.Name) .ToList(). First(). ID.Нанизывать();

OrderByDescending => Заказы Выходные - -9, 1

Выбрать первый элемент - 9 = 211. Логика правильная.

Смежные вопросы