成对分组项目

Ser*_*lov 9 linq

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

Jon*_*eet 17

好吧,你可以这样做:

var pairs = sequence.Select((value, index) => new { value, index } )
                    .GroupBy(x => x.index / 2, x => x.value)
Run Code Online (Sandbox Code Playgroud)

结果是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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将产生一系列元组 - 这里的缺点是,T如果序列具有奇数个项,则最终元组将具有作为"第二"项的默认值.对于序列仅由非空值组成的引用类型,这没关系,但对于某些序列,它无济于事.

  • @ J.Polfer:这不是有效的C#.也许你在期待VB? (2认同)