可枚举订单用于按多个可选字段对订单进行订购

时间:2013-11-18 09:00:48

标签: c# linq enumerable

我必须订购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

2 个答案:

答案 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的元素将首先出现在有序列表中。