2

次の 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>

次のコードで作成できます。

XElement testElement = new XElement("root",
    new XElement("sheetData",
        new XElement("row",
            new XAttribute("r", 1)),
        new XElement("row",
            new XAttribute("r", 2)),
        new XElement("row",
            new XAttribute("r", 3)),
        new XElement("row",
            new XAttribute("r", 4)),
        new XElement("row",
            new XAttribute("r", 5)),
        new XElement("row",
            new XAttribute("r", 6)),
        new XElement("row",
            new XAttribute("r", 7))));

これは、r 属性が 2 である行を見つけるための最良の方法ですか? これは機能しますが、select ステートメントで Where 句を繰り返しています。より良い方法とより効率的な方法があるかどうか疑問に思っています。

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>();

一般に、Linq to Xml クエリが最適化されているかどうかを判断する最良の方法は何ですか?

4

3 に答える 3

4

最良の方法は次のとおりです。

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();
于 2009-03-19T17:21:23.883 に答える
1
//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());
于 2009-03-19T17:21:01.653 に答える
0

コードの Select 句は冗長ではありませんか? where はIEnumerable<XElement>既にを返します。おもう

var row = testElements.Descendents("row").Where(e => (int)e.Attribute("r") == rowNumber).SingleOrDefault();

やりたいことをやればいい

于 2009-03-19T17:22:17.577 に答える