C# 这是表示这个XDocument查询的最有效的方法吗?
我们使用了第三方web服务,该服务返回类似以下内容的XML(为简洁起见,请删节):C# 这是表示这个XDocument查询的最有效的方法吗?,c#,xml,.net-3.5,linq-to-xml,C#,Xml,.net 3.5,Linq To Xml,我们使用了第三方web服务,该服务返回类似以下内容的XML(为简洁起见,请删节): 看起来是这样,但是为什么需要所有的ToList()调用呢?我看到了其中的三个调用,我认为不需要它们,所以它们只是降低了代码的速度。但是,我也没有太多地使用Linq to XMl。所提供的领域的定义相当于更简单的: string realm = (string) products.XPathEvaluate( "string( /*/blocks[@name='products']
看起来是这样,但是为什么需要所有的
ToList()
调用呢?我看到了其中的三个调用,我认为不需要它们,所以它们只是降低了代码的速度。但是,我也没有太多地使用Linq to XMl。所提供的领域
的定义相当于更简单的:
string realm = (string) products.XPathEvaluate(
"string(
/*/blocks[@name='products']
/*/a[@name='product-id' and . = '1236']
/following-sibling::block[1]
)
"
)
事实上,这比原始问题中提供的领域
的定义更具可读性和简洁性
就效率而言,很可能对单个XPath表达式进行求值也会更有效,但是要确定这是否属实,我们需要编写一个应用程序来比较这两种方法的计时。呃……调试会话中有一些遗留问题。现在已排序。感谢您的回复。我知道我可以用XPath简洁得多,但今天我想在这个问题上伸展我的LINQ腿:-)
List<XElement> products = response
.Element("Response")
.Elements("block")
.Where(x => x.Attribute("name").Value == "products")
.Elements("block").ToList();
//
// I broke down the query to aid readability
//
string realm = products.Elements("a")
.Where(x => x.Attribute("name").Value == "product-id")
.Where(y => y.Value == "1235") // hardcoded for example use
.Ancestors()
.First()
.Elements("block")
.Where(z => z.Attribute("name").Value == "realms")
.Elements("block")
.Elements("a")
.First().Value;
string realm = (string) products.XPathEvaluate(
"string(
/*/blocks[@name='products']
/*/a[@name='product-id' and . = '1236']
/following-sibling::block[1]
)
"
)