我正在尝试构建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);
再次感谢
答案 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" }
我希望这会有所帮助。