【问题标题】:Enumerable OrderBy used to order collection by multiple optional fields可枚举的 OrderBy 用于按多个可选字段对集合进行排序
【发布时间】:2013-12-01 08:42:39
【问题描述】:

我必须对 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 中,我显然会得到一个空引用异常。仅当Field2 存在于ChildElements 中时,是否可以修改ThenBy() 的参数以在Field2 之后订购ChildElements?

【问题讨论】:

  • 为什么不做一个名为ValueOrDefault(string elementName)的扩展方法?

标签: c# linq enumerable


【解决方案1】:

只需检查字段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();

(顺便说一句,你不需要在Value 上调用ToString(),因为它已经是一个字符串)

【讨论】:

  • 这仍将始终按Field2 排序,它只会为那些值不可用的子项使用空字符串。
【解决方案2】:

如果您想在 any 的子元素缺少Field2 子元素时删除Field2 的排序,则无法修改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 子级并仍然应用基于具有 Field2 的 ChildElements 元素的排序,您可以使用 @Thomas Levesques 的方法,并提到带有缺少的Field2 将首先出现在有序列表中。

【讨论】:

  • 感谢您的回答,但我需要按 Field2 应用排序,即使某些子元素中缺少它。
猜你喜欢
  • 2013-09-10
  • 2016-07-01
  • 2014-10-14
  • 2015-10-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2011-09-10
相关资源
最近更新 更多