c# - Linq方法获取列表中元素和下一个元素之间的分段差异

标签 c# linq

是否有一种 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,那么您可以 ZipSkip :

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/

相关文章:

linq - Linq和条件和

C# 对 datagridview 行中的相同值进行着色

c# - 如何从日期时间对象中删除年份?

c# - C#中的字符串提取混淆

c# - WebBrowser.Print() 等到完成。 。网

asp.net-mvc-3 - 在 LINQ 查询中调用方法

c# - .NET RSACryptoServiceProvider 使用4096私钥加密,如何在Android上解密

c# - Linq按唯一值对对象进行分组,并创建两个列表

mysql - 使用 Entity Framework 获取唯一行

c# - 使用 LINQ 查找列表中的特定值