2009-01-28 5 views
4

Pourquoi:LINQ to XML et LINQ to Objects syntaxe

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

pas aussi efficace:

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

Et pour un document XML pas si bien formé et que vous ne connaissez que le nom de l'élément que vous recherchez est-ce la meilleure déclaration que vous pouvez utiliser pour trouver l'élément:

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

Merci ....

Répondre

2

Si je ne me trompe pas, en termes de gros O efficacité, c'est la même chose. C'est juste un appel de méthode supplémentaire.

En ce qui concerne la deuxième question,

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

peut être exprimé plus simplement

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

Merde, je ne savais pas SOD avait des surcharges. dans la boîte à outils! – Will

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

Cela doit tester tous les éléments de l'énumération.

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

Ceci peut arrêter les tests et revenir dès qu'il trouve quelque chose.

Si vous avez une très grande énumération, et qu'un objet près du front satisfait la condition, alors le premier peut être significativement plus rapide. Dans le cas où le nombre d'items satisfaisant la condition augmente avec la taille de l'énumération, l'accélération peut être asymptotique. Par exemple, si un élément sur k satisfait en moyenne la condition, le temps d'exécution moyen du second extrait est constant.

+0

'Cela peut arrêter de tester les éléments et revenir dès qu'il trouve quelque chose.' Ceci n'est pas vrai - 'SingleOrDefault' lève une exception quand la collection contient plus d'un élément, donc il ne peut pas arrêter l'itération sur le premier élément correspondant. C'est ainsi que 'First' /' FirstOrDefault' fonctionne. – MarcinJuraszek