2010-04-24 50 views
1

使用LINQ to XML,我如何根據序數位置連接兩組數據?使用LINQ to XML,如何根據序號位置連接兩組數據?

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

基於上述片段,我想在兩組連接在一起,使得「A」和「1」是在相同的記錄,「B」和「2」是在相同的記錄, 「C」和「3」在同一記錄中。

回答

5

這是Enumerable.Zip擴展確實在.NET 4你會寫像這樣(假設這是整個XDocument):

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 }); 

如果您使用.NET 3.5或更早版本,這不是太難寫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

下面是一個使用選擇的過載的另一種方法,其中將包括一個元素的索引

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 }; 
相關問題