成对分组项目

时间:2011-07-31 08:00:27

标签: linq

我有项目列表,例如:{ i1, i2, i3, i4, i5, i6, i7 } 我想获得一个列表,其中每个项目都是源列表中的一对项目:{ {i1, i2}, {i3, i4}, {i5, i6}, {i7} } i7是对中的单个商品,因为没有商品i8 是否可以使用LINQ?

1 个答案:

答案 0 :(得分:17)

嗯,你可以做:

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

结果是IGrouping<int, T>,键为0,1,2等,每组的内容为一个或两个项目。

但是,我可能会写一个自定义扩展方法:

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

这将产生一系列元组 - 这里的缺点是如果序列具有奇数个项目,则最终元组将具有T的默认值作为“第二”项。对于序列只包含非空值的引用类型,这没关系,但是对于某些序列它没有帮助。