2009-01-28 36 views
4

爲什麼:的LINQ to XML和LINQ到對象語法

(CheckBox)lstControls.Where(x => x.ID == "some_id").SingleOrDefault(); 

不到預期的效果:

(CheckBox)lstControls.SingleOrDefault(x => x.ID == "some_id"); 

而且對於形成不那麼良好的XML文檔,你只知道您正在尋找該元素的名稱是對此最好的語句,您可以用找到的元素:

var xmlElem = (from n in xDocument.Descendants() where (string)n.Attribute("name") == "some_node_name" select n).SingleOrDefault(); 

感謝....

回答

2

如果我沒有弄錯,就O大效率而言,這是一樣的。這只是一個額外的方法調用。

關於第二個問題,

var xmlElem = (from n in xDocument.Descendants() where (string)n.Attribute("name") == "some_node_name" select n).SingleOrDefault(); 

可以更簡單地表示爲

var xmlElem = xDocument.Descendants().SingleOrDefault(n => (string)n.Attribute("name") == "some_node_name"); 
+0

該死,我不知道SOD有超負荷。進入工具箱! – Will 2009-01-28 15:01:36

0
(CheckBox)lstControls.Where(x => x.ID == "some_id").SingleOrDefault(); 

這必須在枚舉測試每個項目。

(CheckBox)lstControls.SingleOrDefault(x => x.ID == "some_id"); 

這可以停止測試項目,並在發現內容後立即返回。

如果您有一個非常大的枚舉,並且前端附近的項目滿足條件,那麼前者可能會快得多。在滿足條件的項目數量隨枚舉大小增加的情況下,加速可能是漸近的。例如,如果平均每K個項目中有一個滿足條件,則第二個片段的平均運行時間是恆定的。

+0

'這可以停止測試項目並在發現問題時立即返回。'這不是真的 - 當Collection包含多於一個元素時,SingleOrDefault會拋出一個異常,所以它不能停止迭代第一個匹配的元素。這就是`First` /`FirstOrDefault`的工作原理。 – MarcinJuraszek 2012-06-12 18:04:29