c# - 我可以在 LINQ 中获取两个 IEnumerables 的增量吗?

标签 c# linq

不是聚合增量,而是每个元素的增量。下面是一些代码来解释我的意思:

var deltaTotals = _deltaEnumerable.Select(a => a.Amount).ToList();
var oldTotals = _totalsEnumerable.Select(d => d.Amount).ToList();

// trigger change in _totalsEnumerable

// ** can LINQ do the lines below 
var newTotals = totalsEnumerable.Select(d => d.Amount);
for (var i = 0; i < 7; i++) {
    var newAmount = oldTotals[i] - deltaTotals[i];
    Assert.That(newTotals.ElementAt(i), Is.EqualTo(newAmount));
}

最后四行代码似乎在 LINQ 中可能有更优雅的方式。

干杯,
贝瑞尔

最佳答案

你想要的是Enumerable.Zip扩展方法。

一个示例用法是:

var delta = oldTotals.Zip(newTotals, (o, n) => n.Amount - o.Amount);

请注意,这是 .NET 4.0 的新功能。在 .NET 3.5 中,您必须编写自己的扩展。像这样:

public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(
    this IEnumerable<TFirst> first,
    IEnumerable<TSecond> second,
    Func<TFirst, TSecond, TResult> resultSelector)
{
    using (var firstEnumerator = first.GetEnumerator())
    using (var secondEnumerator = second.GetEnumerator())
    {
        while ((firstEnumerator.MoveNext() && secondEnumerator.MoveNext()))
        {
            yield return resultSelector(firstEnumerator.Current,
                secondEnumerator.Current);
        }
    }
}

关于c# - 我可以在 LINQ 中获取两个 IEnumerables 的增量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2352379/

相关文章:

c# - 使用 Microsoft.Hadoop.Client 的 LINQ to HDInsight Hive 表

c# - 从 Linq-to-Entities 中选择 Linq-to-XML?

c# - 如何在linq中制作if语句

c# - 在 View 状态中存储控件的自定义属性

c# - 在单元测试中创建 System.Web.Caching.Cache 对象

c# - 检查针对 SQL Server 数据库的 LINQ 查询

c# - 使用 linq 填充字典

c# - C# 根据键对字典列表进行排序

c# - 数据绑定(bind)问题 asp.net 下拉列表

c# - 访问链接 "Resource File"中的项目