Я не знаю, слишком ли поздно, но если вы хотите разобрать текст и если это целое число, тогда сортируйте по значению, иначе сортируйте по тексту, тогда это может помочь.
Вам нужно определить функцию, подобную этой, чтобы включить синтаксический анализ в выражениях LINQ:
Func<string, int?> tryParseInteger = text =>
{
int? result = null;
int parsed;
if (int.TryParse(text, out parsed))
{
result = parsed;
}
return result;
};
Тогда вы можете делать такие запросы:
var xs = new [] { "Hello", "3ff", "4.5", "5", };
var rs =
(from x in xs
select tryParseInteger(x)).ToArray();
// rs == new int?[] { null, null, null, 5, };
В вашем случае вы, возможно, захотите что-то вроде этого:
var elements = new []
{
"<desc><ru>AAA</ru></desc>",
"<desc><ru>1</ru></desc>",
"<desc><ru>42</ru></desc>",
"<desc><ru>-7</ru></desc>",
"<desc><ru>BBB</ru></desc>",
"<desc><ru>22</ru></desc>",
};
var query =
from e in elements
let xe = XElement.Parse(e)
let v = xe.Element("ru").Value
orderby v
orderby tryParseInteger(v)
select v;
Что даст вам:
{ "AAA", "BBB", "-7", "1", "22", "42" }
Если вы хотите обработать нецелые числа (т. Е. Проанализированные как нулевые) как ноль, измените запрос, используя следующую строку:
orderby tryParseInteger(v) ?? 0
Тогда вы получите это:
{ "-7", "AAA", "BBB", "1", "22", "42" }
Надеюсь, это поможет.