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

首先,我创建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:'否定了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/

10-12 00:28