C# 如何针对列表属性优化Linq到Xml查询?
给定以下Xml片段:C# 如何针对列表属性优化Linq到Xml查询?,c#,optimization,.net-3.5,linq-to-xml,C#,Optimization,.net 3.5,Linq To Xml,给定以下Xml片段: <root> <sheetData> <row r="1" /> <row r="2" /> <row r="3" /> <row r="4" /> <row r="5" /> <row r="6" /> <row r="7" /> </sheetData> </root> 这是
<root>
<sheetData>
<row r="1" />
<row r="2" />
<row r="3" />
<row r="4" />
<row r="5" />
<row r="6" />
<row r="7" />
</sheetData>
</root>
这是查找r属性为2的行的最佳方法吗?这是可行的,但我在重复中的Where子句
select语句,我想知道是否有更好的方法和更有效的方法
int rowNumber = 2;
XElement rowElement = testElement
.Descendants("sheetData")
.Where<XElement>(item => item.Descendants("row")
.Where<XElement>(i => i.Attribute("r").Value == rowNumber.ToString())
.FirstOrDefault<XElement>() != null)
.Select<XElement, XElement>(item => item.Descendants("row")
.Where<XElement>(i => i.Attribute("r").Value == rowNumber.ToString())
.FirstOrDefault<XElement>())
.FirstOrDefault<XElement>();
int行数=2;
XElement行元素=testElement
.后代(“数据表”)
.Where(item=>item.substands(“行”)
.Where(i=>i.Attribute(“r”).Value==rowNumber.ToString())
.FirstOrDefault()!=null)
.Select(item=>item.substands(“行”)
.Where(i=>i.Attribute(“r”).Value==rowNumber.ToString())
.FirstOrDefault())
.FirstOrDefault();
一般来说,确定Linq到Xml查询是否优化的最佳方法是什么?最佳方法是:
//if sheetData appears multiple times
XElement rowElement = testElement
.Descendants("sheetData")
.SelectMany(s=>s.Descendats("row))
.Where(i=>i.Attribute("r").Value == rowNumber.ToString());
//if sheetData appears once
XElement rowElement = testElement
.Element("sheetData")
.Descendants("row))
.Where(i=>i.Attribute("r").Value == rowNumber.ToString());
var row = testElement
.XPathSelectElements("sheetData/row[@r='2']")
.FirstOrDefault();
不重复Where
调用的纯LINQ查询:
var row = testElement
.Descendants("sheetData")
.Descendants("row")
.Where(x => x.Attribute("r").Value == "2")
.FirstOrDefault();
代码中的Select子句不是多余的吗?其中返回一个
IEnumerable
。我想
var row = testElements.Descendents("row").Where(e => (int)e.Attribute("r") == rowNumber).SingleOrDefault();
应该做您想做的事情XPathSelectElements在哪里定义?如果它是一个扩展方法,请发布名称空间,我希望在XElement:)中使用它。其中(x=>(string)x.Attribute(“r”)==“2”)。如果不存在
r
属性,它将不会抛出NullReferenceException。找到它:+1非常好:)-我肯定会经常用这个
var row = testElements.Descendents("row").Where(e => (int)e.Attribute("r") == rowNumber).SingleOrDefault();