2010-02-21 4 views
0

J'ai une requête LINQ qui interroge sur IEnumberable. Quand j'ai un élément correspondant à ma clause where, je voudrais connaître la position de l'élément dans IEnumberable.Lieu de XElement lors de l'interrogation sur IEnumerable LINQ

var result = from e in elements 
      where (string) e.Attribute("class") == "something" 
      select e.Position(); 

L'e.Position() ne compile bien sûr pas. La valeur de e.Position() serait la position de l'élément sélectionné dans les éléments IEnumberable.

Des idées sur comment faire cela?

Répondre

2

Vous devez utiliser le overloaded Select method qui permet un indice puisque cette capacité ne sont pas disponibles dans la syntaxe de requête.

elements.Select((e, i) => new { Element = e, Index = i }) 
     .Where(item => (string)item.Element.Attribute("class") == "something") 
     .Select(item => item.Index); 
+0

Merci pour la réponse rapide. –

0

Si vous utilisez .NET 4.0, vous pouvez utiliser la (nouvelle) méthode Zip et écrire la même chose en utilisant la syntaxe de requête ainsi. Il crée des objets temporaires, de sorte qu'il ne soit pas aussi efficace, mais certaines personnes peuvent trouver plus lisible:

var result = from e in elements.Zip 
       (Enumerable.Range(0, elements.Count()), Tuple.Create) 
      where (string)e.Item1.Attribute("class") == "something" 
      select e.Item2; 

Ce zips 'la collection d'entrée avec une séquence générée de nombres (avec la même plage que est la longueur de la collection). Ensuite, vous pouvez stocker la valeur combinée soit en utilisant la classe Tuple (c'est ce que je l'ai fait) ou vous pouvez utiliser le type anonyme.

Questions connexes