2010-04-24 3 views
1

En utilisant LINQ to XML, comment puis-je joindre deux ensembles de données en fonction de la position ordinale?En utilisant LINQ to XML, comment puis-je joindre deux ensembles de données en fonction de la position ordinale?

<document> 
    <set1> 
     <value>A</value> 
     <value>B</value> 
     <value>C</value> 
    </set1> 
    <set2> 
     <value>1</value> 
     <value>2</value> 
     <value>3</value> 
    </set2> 
</document> 

Basé sur le fragment ci-dessus, je voudrais joindre les deux ensembles ensemble tels que « A » et « 1 » sont dans le même dossier, « B » et « 2 » sont dans le même dossier, et "C" et "3" sont dans le même enregistrement.

Répondre

5

C'est ce que l'extension Enumerable.Zip fait dans .NET 4. Vous écririez comme si (en supposant que ce soit le XDocument entier):

var set1Elements = document.Element("set1").Elements(); 
var set2Elements = document.Element("set2").Elements(); 
var results = set1Elements.Zip(set2Elements, 
    (s1, s2) => new { Value1 = s1.Value, Value2 = s2.Value }); 

Si vous utilisez .NET 3.5 ou une version antérieure , il est pas trop difficile d'écrire l'extension Zip:

public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(
    this IEnumerable<TFirst> first, 
    IEnumerable<TSecond> second, 
    Func<TFirst, TSecond, TResult> resultSelector) 
{ 
    using (var firstEnumerator = first.GetEnumerator()) 
    using (var secondEnumerator = second.GetEnumerator()) 
    { 
     while ((firstEnumerator.MoveNext() && secondEnumerator.MoveNext())) 
     { 
      yield return resultSelector(firstEnumerator.Current, 
       secondEnumerator.Current); 
     } 
    } 
} 
3

Voici une autre méthode utilisant la surcharge de Sélectionnez qui inclura l'index d'un élément

XElement set1 = document.Root.Element("set1"); 
XElement set2 = document.Root.Element("set2"); 

var query = from value1 in set1.Descendants("value").Select((ele, idx) => new { Value = ele.Value, Index = idx }) 
      join value2 in set2.Descendants("value").Select((ele, idx) => new { Value = ele.Value, Index = idx }) 
      on value1.Index equals value2.Index 
      select new { Value1 = value1.Value, Value2 = value2.Value }; 
Questions connexes