我有项目列表,例如:{ i1, i2, i3, i4, i5, i6, i7 }
我想获得一个列表,其中每个项目都是源列表中的一对项目:{ {i1, i2}, {i3, i4}, {i5, i6}, {i7} }
i7
是对中的单个商品,因为没有商品i8
是否可以使用LINQ?
答案 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
的默认值作为“第二”项。对于序列只包含非空值的引用类型,这没关系,但是对于某些序列它没有帮助。