Group items in pairs

后端 未结 1 2019
盖世英雄少女心
盖世英雄少女心 2020-12-16 17:30

I have list of items, for example: { i1, i2, i3, i4, i5, i6, i7 }.
I want to get a list, where every item is a pair of items from source list: { {i1,

相关标签:
1条回答
  • 2020-12-16 17:58

    Well, you could do:

    var pairs = sequence.Select((value, index) => new { value, index } )
                        .GroupBy(x => x.index / 2, x => x.value)
    

    The result is an IGrouping<int, T> with a key of 0, 1, 2 etc and the contents of each group being one or two items.

    However, I'd possibly write a custom extension method:

    public static IEnumerable<Tuple<T, T>> PairUp<T>(this IEnumerable<T> source)
    {
        using (var iterator = source.GetEnumerator())
        {
            while (iterator.MoveNext())
            {
                var first = iterator.Current;
                var second = iterator.MoveNext() ? iterator.Current : default(T);
                yield return Tuple.Create(first, second);
            }
        }
    }
    

    This will yield a sequence of tuples - the downside here is that the final tuple will have the default value for T as the "second" item if the sequence has an odd number of items. For reference types where the sequence only consists of non-null values, that's okay, but for some sequences it wouldn't help.

    0 讨论(0)
提交回复
热议问题