var array = new string[] { "one", "two", "three" };
var result = Enumerable.Range(1, array.Length - 1)
.Select(i => new[] { array[i - 1], array[i] });
这是使用数组而不是元组的@TrustMe 解决方案(只是为了向您展示示例,您不应该接受我的回答):
IEnumerable<string> collection = new string[] { "one", "two", "three" };
var result = collection.Zip(collection.Skip(1), (x,y) => new [] { x, y });
但请记住,如果您不使用按索引访问(使用数组或列表) ,该集合将被枚举两次。
更新这是一个扩展方法,它将与集合一起使用,并且只会枚举一次序列:
public static class Extensions
{
public static IEnumerable<T[]> GetOverlappingPairs<T>(
this IEnumerable<T> source)
{
var enumerator = source.GetEnumerator();
enumerator.MoveNext();
var first = enumerator.Current;
while (enumerator.MoveNext())
{
var second = enumerator.Current;
yield return new T[] { first, second };
first = second;
}
}
}
用法:
var result = collection.GetOverlappingPairs();