我必须订购XML元素的子元素。子元素包含多个非强制元素。
到目前为止我尝试的是:
var orderedElements = parent.Elements("ChildElement")
.OrderBy(child => child.Element("Field1").Value.ToString())
.ThenBy(child => child.Element("Field2").Value.ToString())
.ToList();
问题是Field2不是ChildElement
的必需元素,如果Field2
中不存在ChildElement
,我显然会得到空引用异常。是否可以修改ThenBy()
的参数,只有在ChildElements
中存在Field2
的情况下Field2
之后订购ChildElements
?
答案 0 :(得分:2)
只需检查字段element
是否存在:
var orderedElements = parent.Elements("ChildElement")
.OrderBy(child => child.Element("Field1").Value)
.ThenBy(child => child.Element("Field2") != null ? child.Element("Field2").Value : string.Empty)
.ToList();
(顺便说一下,你不需要在ToString()
上拨打Value
,因为它已经是一个字符串了)
答案 1 :(得分:0)
如果您希望在任何子元素缺少Field2
子元素时按Field2
删除排序,则无法修改{{1}的参数1}}方法,但你可以这样做:
ThenBy
如果您只是想忽略丢失的var orderedElements = parent
.Elements("ChildElement")
.All(child2 => child2.Element("Field2") != null) ?
parent.Elements("ChildElement")
.OrderBy(child => child.Element("Field1").Value)
.ThenBy(child => child.Element("Field2").Value)
.ToList() :
parent.Elements("ChildElement")
.OrderBy(child => child.Element("Field1").Value)
.ToList();
子项并仍然根据Field2
ChildElements
元素应用排序,您可以使用@Thomas Levesques的方法,请注意,缺少Field2
的元素将首先出现在有序列表中。