我有这样的结构
<root>
<parent>
<item>
<value>1</value>
</item>
<item>
<value>3</value>
</item>
</parent>
</root>
现在我想添加一个值为2的新项目。我想将它添加到正确的位置。我的linq看起来像这样:
xDoc.Root
.Element("parent")
.Elements("item")
.Where(i => i.Element("value").Value < 2)
.LastOfDefault()
.AddAfterSelf(new XElement("item", new XElement("value", 2)));
这适用于该结构。
但如果父级中没有元素,则会因NullReferenceException而失败:
<root>
<parent>
</parent>
</root>
在这种情况下,我只想将此元素添加到父节点。如何用更少的血来做到这一点?
答案 0 :(得分:2)
在尝试添加项目之前,您需要先验证是否找到了某个项目。幸运的是,C#6添加了空条件运算符,以表达这一点。
doc.Elements("root").Elements("parent").Elements("item")
.OrderBy(i => (int)i.Element("value"))
.LastOrDefault(i => (int)i.Element("value") < 2)
?.AddAfterSelf(new XElement("item", new XElement("value", 2)));
如果您使用的是旧版本,请明确检查。
var last = doc.Elements("root").Elements("parent").Elements("item")
.OrderBy(i => (int)i.Element("value"))
.LastOrDefault(i => (int)i.Element("value") < 2);
if (last != null)
last.AddAfterSelf(new XElement("item", new XElement("value", 2)));