按解析的值解析字符串和顺序

时间:2011-03-01 09:56:04

标签: c# linq string linq-to-nhibernate

我正在尝试构建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中按顺序有两个项目

谢谢大家,抱歉我的英语不好 感谢所有回复,但如何将结果转换为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 个答案:

答案 0 :(得分:2)

这将生成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 :(得分:2)

问题更新后 - 这将按<en>节点值返回您的有序数据:

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

结果值为IOrderedEnumerable<Test>类型。

答案 2 :(得分:1)

我不确定我的预期结果是什么,但是如果你需要选择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();

答案 3 :(得分:0)

我不知道是否为时已晚,但如果你想解析文本,如果它是一个整数,那么按值排序,否则按文字排序,这可能会有所帮助。

您需要定义这样的函数以在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" }

如果要将非整数(即解析为null)视为零,则使用以下行更改查询:

    orderby tryParseInteger(v) ?? 0

然后你会得到这个:

{ "-7", "AAA", "BBB", "1", "22", "42" }

我希望这会有所帮助。