是否有一种 Linq 方法可以在迭代时知道序列中的下一个元素是什么?作为一个具体的例子,假设我有一个整数列表,我想计算每个元素和它的后继元素之间的差异,所以例如我希望能够写
var myList = new List<int>() { 1,3,8,2,10 };
var differences = myList.Select( ml => ml.Next() - ml ) // pseudo-code, obviously
我想要的结果是一个列表 { 2,5,-6,8 }。
显然,这在 for 循环中是微不足道的,但有人能想到 Linq 中的简洁单行代码来完成这项工作吗?
最佳答案
如果您使用的是 .NET 4,那么您可以 Zip
和 Skip
:
var differences = myList.Zip(myList.Skip(1), (x, y) => y - x);
如果您使用的是旧版本的框架,和/或您想要一种稍微更有效的方法来执行此操作,那么您可以创建一个简单的扩展方法:
var differences = myList.Pairwise((x, y) => y - x);
// ...
public static class EnumerableExtensions
{
public static IEnumerable<T> Pairwise<T>(
this IEnumerable<T> source, Func<T, T, T> selector)
{
if (source == null) throw new ArgumentNullException("source");
if (selector == null) throw new ArgumentNullException("selector");
using (var e = source.GetEnumerator())
{
if (!e.MoveNext()) throw new InvalidOperationException("Sequence cannot be empty.");
T prev = e.Current;
if (!e.MoveNext()) throw new InvalidOperationException("Sequence must contain at least two elements.");
do
{
yield return selector(prev, e.Current);
prev = e.Current;
} while (e.MoveNext());
}
}
}
关于c# - Linq方法获取列表中元素和下一个元素之间的分段差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3970060/