Разобрать строку и порядок по проанализированному значению - PullRequest
0 голосов
/ 01 марта 2011

Я пытаюсь построить выражение 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) 

тогда у нас есть два элемента в ru в порядке 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 ]

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

После обновления вопроса - это вернет ваши заказанные данные по <en> значению узла:

var result = arr
    .OrderBy(t=>
        XElement.Parse(t.data).Element("en").Value
    );

Возможен результат типа IOrderedEnumerable<Test>.

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

Будет получен список значений в тегах 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
}
1 голос
/ 01 марта 2011

Я не уверен, что у меня есть ожидаемые результаты, но если вам нужно выбрать значения в 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();
0 голосов
/ 02 марта 2011

Я не знаю, слишком ли поздно, но если вы хотите разобрать текст и если это целое число, тогда сортируйте по значению, иначе сортируйте по тексту, тогда это может помочь.

Вам нужно определить функцию, подобную этой, чтобы включить синтаксический анализ в выражениях 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" }

Надеюсь, это поможет.

...