Используя LINQ to XML, как я могу объединить два набора данных на основе порядкового номера? - PullRequest
1 голос
/ 24 апреля 2010

Используя 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» находятся в одной записи.

Ответы [ 2 ]

5 голосов
/ 24 апреля 2010

Это то, что расширение 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 голосов
/ 24 апреля 2010

Вот еще один метод, использующий перегрузку Select, которая будет включать индекс элемента

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 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...