C# 如何针对列表属性优化Linq到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> 这是

给定以下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>
这是查找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();