Разобрать строку и порядок по проанализированному значению
Я пытаюсь построить выражение linq, чтобы решить мою проблему. У меня есть список строк
List<string> arr = new List<string>();
arr.Add("<desc><ru>1</ru><en>3</en></desc>");
arr.Add("<desc><ru>2</ru><en>4</en></desc>");
я хочу разобрать каждый товар и результаты заказа
fake sample:
arr.Select(ParseItem("en")).OrderBy(x)
тогда у нас есть две позиции в ру в порядке 1,2
Спасибо за все и извините за мой плохой английский Спасибо за ответ, но как конвертировать результаты в IQueryable
class Test { public string data { get; set; } }
List<Test> arr = new List<Test>();
arr.Add(new Test { data = "<desc><ru>AAA</ru><en>One</en></desc>" });
arr.Add(new Test { data = "<desc><ru>1</ru><en>Two</en></desc>" });
arr.Add(new Test { data = "<desc><ru>22</ru><en>Ab</en></desc>" });
IQueryable<Test> t = arr.AsQueryable();
// here the trouble how to convert to IQueryable<Test>
t = t.Select(s => XElement.Parse(s.data)).Select(x => x.Element("en")).
OrderBy(el => el.Value);
еще раз спасибо
4 ответа
После обновления вопроса - это вернет ваши заказанные данные по <en>
значение узла:
var result = arr
.OrderBy(t=>
XElement.Parse(t.data).Element("en").Value
);
Результат достоверен из IOrderedEnumerable<Test>
тип.
Это создаст список значений в ru
теги (при условии, что они являются целыми числами), упорядоченные по значениям в en
теги (опять же, предполагая целые числа).
List<string> items = arr.Select(s => XElement.Parse(s))
.OrderBy(xml => (int)xml.Element("en"))
.Select(xml => (int)xml.Element("ru"))
.ToList();
Если вы просто хотите перечислить, вы можете опустить ToList
вызов:
foreach (var item in arr.Select(s => XElement.Parse(s))
.OrderBy(xml => (int)xml.Element("en"))
.Select(xml => (int)xml.Element("ru")))
{
// do something with item
}
Я не уверен, что у меня есть ожидаемые результаты, но если вам нужно выбрать значения в en
упорядочено по значению в ru
тогда вот оно:
var orderedItems = (
from item in arr
let x = XElement.Parse(item)
let ruValue = (int)x.Element("ru")
let enValue = (int)x.Element("en")
orderby ruValue
select enValue
).ToList();
Я не знаю, было ли уже слишком поздно, но если вы хотите разобрать текст и если это целое число, тогда сортируйте по значению, иначе сортируйте по тексту, тогда это может помочь.
Вам нужно определить такую функцию, чтобы включить синтаксический анализ в выражениях 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" }
Надеюсь, это поможет.