LINQ: сортировка по (Обрабатывать буквы как цифры) - PullRequest
2 голосов
/ 05 сентября 2011

Как мне использовать linq для сортировки моих данных, когда мои данные содержат цифры и буквы?

Например, мой текущий linq

Dim MyQuery = From c In XDoc.Descendants() _
Where c.Attribute(Y) IsNot Nothing And c.Attribute(Str) IsNot Nothing _
Order By Val(c.Attribute(Y).Value), Val(c.Attribute(X).Value) _
Select Str = c.Attribute(Str)

возвращает что-то вроде следующего

13
167   
172   
231      
44    
49  

это не то, что мне бы хотелось ... Вывод должен быть таким, как показано ниже

13
44    
49 
167   
172   
231      

Есть идеи?Спасибо за ваше время

Ответы [ 2 ]

3 голосов
/ 05 сентября 2011

Не используйте Value свойство XAttribute - используйте явное преобразование в Integerдумаю это должно сделать это:

Dim MyQuery = From c In XDoc.Descendants() _
Where c.Attribute(Y) IsNot Nothing And c.Attribute(Str) IsNot Nothing _
Order By CInt(c.Attribute(Y)), CInt(c.Attribute(X)) _
Select Str = c.Attribute(Str)

Обратите внимание, что обычно лучше использовать явные преобразования, поддерживаемые XAttribute и XElement, чем Int32.Parse и т. Д., так как тогда будет выполняться специфичный для XML синтаксический анализ, следуя соответствующим стандартным форматам.

2 голосов
/ 05 сентября 2011

Преобразуйте строки в числа в вашем предложении сортировки, например,

Dim MyQuery = From c In XDoc.Descendants() _
Where c.Attribute(Y) IsNot Nothing And c.Attribute(Str) IsNot Nothing _
Order By CInt(c.Attribute(Y)), CInt(c.Attribute(X)) _
Select Str = c.Attribute(Str)

Обратите внимание, что если какая-либо из строк не может быть преобразована в int (или любой числовой тип, который вы решили использовать)тогда вы получите исключение.В этом случае вам придется сделать что-то более сложное, например, спроецировать вашу последовательность на новую последовательность с любыми строками, представляющими числовые значения, преобразованные в числовые значения, а остальное оставить без изменений, в результате сортировка будет выполнена буквенно-цифровой.

...