作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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/
我是一名优秀的程序员,十分优秀!