gpt4 book ai didi

c# - 如何将 ISortedEnumerable 添加到 XElement?

转载 作者:行者123 更新时间:2023-11-30 21:41:04 26 4
gpt4 key购买 nike

我正在尝试使用 Linq 对 XElement 的子项进行排序,然后将现有的子项替换为已排序。

首先我创建 XElement:

XElement WithLinq =
new XElement("Names",
from cust in Customers.AsEnumerable()
select
new XElement("Customer",
new XAttribute("ID", cust.ID),
new XElement("Name", cust.Name),
new XElement("Purchases",
from pur in cust.Purchases
select
new XElement("Purchase",
new XElement("Produkt",pur.Description),
new XAttribute("ID",pur.ID),
new XElement("Price",pur.Price),
new XComment("teraz daty"),
new XElement("Date",pur.Date), //Formatuje DateTime zgodnie z normami XMLa
new XElement("DataAleNieDoKonca",pur.Date.ToString(CultureInfo.InvariantCulture)))))
);

然后我对节点进行排序:

var NowaKolejnosc = WithLinq.Elements().Last().Elements().OrderBy(n => n.Name).ThenBy(n => n.Value);

并替换它们:

WithLinq.Elements().Last().ReplaceNodes(NowaKolejnosc);

但我得到一个运行时异常:ArgumentException: 'Co najmniej jeden obiekt musi implementować element IComparable.'翻译:至少一个对象必须实现 IComparable。

我不明白导致异常的原因以及如何解决它。

最佳答案

发生错误是因为 XElement.Name 的类型为 System.Xml.Linq.XName . XName 没有实现 IComparable

XName 包装一个 System.String 值,它覆盖 ToString 以返回该 System.String 值。

由于 System.String 实现了 IComparable,我们可以利用这些知识正确并成功地调用 OrderBy。这具有所需的语义,因为从逻辑上讲,我们想要比较包装的字符串。

WithLinq.Elements().Last().Elements().OrderBy(n => n.Name.ToString()).ThenBy(n => n.Value)

当使用多个排序 LINQ 运算符时,我发现使用查询表达式语法更具可读性。

from element in WithLinq.Elements().Last().Elements()
orderby element.Name.ToString(), element.Value
select element

关于c# - 如何将 ISortedEnumerable<XElement> 添加到 XElement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43846208/

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