C # LINQ orderby - PullRequest
       10

C # LINQ orderby

3 голосов
/ 01 марта 2011

У меня есть Xelement, содержащий несколько элементов.

У меня есть следующий код для сортировки:

var calculation = from y in x.Elements("row")
                 orderby y.Element("BUILD_ORDER").Value
                 select new
                 {
                     calcAttribute = y.Element("ELEMENT").Value

                 };

Что отлично работает, пока BUILD_ORDER> 10, он заказывает 10 сразу после 1.

Если я хочу это в строгом числовом порядке, я помещаю элемент в Int, это правильный способ сделать это, или у LINQ есть встроенное расширение / метод?

orderby Convert.ToInt32(y.Element("BUILD_ORDER").Value)

Ответы [ 4 ]

7 голосов
/ 01 марта 2011

LINQ to Objects не имеет встроенного преобразования, но LINQ to XML имеет:

var calculation = from y in x.Elements("row")
                  orderby (int) y.Element("BUILD_ORDER")
                  select new
                  {
                      calcAttribute = y.Element("ELEMENT").Value
                  };

Есть ли причина, по которой вы используете анонимный тип, а не просто выбираете нужное значение? Например:

var calculation = from y in x.Elements("row")
                  orderby (int) y.Element("BUILD_ORDER")
                  select y.Element("ELEMENT").Value;

Обратите внимание, что оба из них вызовут исключение, если субэлементы BUILD_ORDER или ELEMENT отсутствуют. Это можно исправить, используя преобразование в int? вместо int для BUILD_ORDER и преобразование в string для ELEMENT:

var calculation = from y in x.Elements("row")
                  orderby (int?) y.Element("BUILD_ORDER")
                  select (string) y.Element("ELEMENT");

Это все равно не удастся, если BUILD_ORDER существует, но, конечно, не может быть проанализирован как целое число.

Если ваши данные должны всегда иметь эти элементы, первая форма лучше, так как она обнаружит любые ошибки данных раньше.

2 голосов
/ 01 марта 2011

Похоже, что он читает порядок сборки как строку, а не как int. Ваш образец должен работать, или попробуйте

orderby int.Parse(y.Element("BUILD_ORDER").Value)
2 голосов
/ 01 марта 2011

Да, поскольку ваши значения XML не напечатаны, вы должны привести их вручную, чтобы .NET могла выполнять числовую сортировку.

Кстати, int.Parse даст вам немного лучшую производительность.

2 голосов
/ 01 марта 2011

выглядит хорошо для меня.Вы также можете использовать Int32.Parse(...).Я не знаю ни одного встроенного метода для сортировки строк как целых чисел, но вы наверняка могли бы написать свой собственный.

...