gpt4 book ai didi

c# - 在 Linq 中使用加入重新排序

转载 作者:太空宇宙 更新时间:2023-11-03 14:21:37 25 4
gpt4 key购买 nike

我希望我的 XElements 按文档顺序排列。我可以像本例中那样使用 Join 重新排序我的 xpathGroups 吗?

XDocument message_doc = XDocument.Load(message);

var xpathGroups =
from e in contextErrors
group e by SelectElement(message_doc, e.XPath) into g
select new
{
Element = g.Key,
ErrorItems = g,
};

var documentOrderedGroups =
from elem in message_doc.Root.DescendantsAndSelf()
join e in xpathGroups on elem equals e.Element
select e;

留言:

<root>
<a>
<aa>
<aaa>9999</aaa>
</aa>
<aa>
<aaa>8888</aaa>
</aa>
</a>
<b>
<bb>
<bbb>7777</bbb>
</bb>
</b>
<c>
<cc>
<ccc>6666</ccc>
</cc>
</c>
</root>

输入数据:

/root/c[1]/cc[1]/ccc[1]
/root/a[1]/aa[2]/aaa[1]
/root/b[1]/bb[1]/bbb[1]
/root/a[1]/aa[1]/aaa[1]

预期结果:

/root/a[1]/aa[1]/aaa[1]
/root/a[1]/aa[2]/aaa[1]
/root/b[1]/bb[1]/bbb[1]
/root/c[1]/cc[1]/ccc[1]

最佳答案

您的原始查询有效,结果是一个包含元素及其相关 XPath 查询(按文档顺序排列)的对象。但是,结果与您所做的您只希望元素按文档顺序排列的注释相冲突。

元素和 XPath:如果您同时需要元素及其 XPath,则连接将保留为查询的一部分,但我会用匿名类型的投影替换分组。

var xpathElements = contextErrors.Select(e => new
{
Element = message_doc.XPathSelectElement(e.XPath),
XPath = e.XPath
});
var ordered = from e in message_doc.Descendants()
join o in xpathElements on e equals o.Element
select o;

仅限元素:如果您只希望元素按文档顺序排列,以下方法也适用。

var xpathElements = contextErrors.Select(e => message_doc.XPathSelectElement(e.XPath));
var ordered = message_doc.Descendants()
.Where(e => xpathElements.Any(o => e == o));

在这两个示例中,我都使用了 XPathSelectElement method代替你的我收集的 SelectElement 方法具有相同的目的。

关于c# - 在 Linq 中使用加入重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5195277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com