C# 循环遍历 IEnumerable 以进行使用前 n 个和后 n 个元素的计算

标签 c# list foreach ienumerable

我发现自己经常处理一个 IEnumerable 对象,我需要循环遍历该对象,并为依赖于紧接在前和紧随其后的 n 个对象的每个元素进行计算。

一个常见的例子是计算滚动平均值,但其他时候计算比这更复杂,并且依赖于列表中每个元素的几个字段

我永远不确定构建循环的最佳方式。效率很重要,但可维护性和可读性更重要。

  • 有时我会转换为 List,然后使用 for 循环获取元素 [i-1]、[i]、[i+1],然后执行我的计算。

  • 其他时候我将它作为一个 IEnumerable 保存,但我“缓存”了前几个元素,这样我就不会对 i 进行计算,直到我在 foreach 中到达 [i+1]循环。

  • 我还考虑过使用链表,这样我就可以使用 .Previous 和 .Next 方法。

关于哪种技术最适合使用有什么建议吗?

最佳答案

一个选择是制作一个扩展方法,提供一个您可以使用的滚动“窗口”。这将允许您以简单的方式编写循环:

IEnumerable<IList<T>> CreateRollingWindow(IEnumerable<T> items, int size)
{
    LinkedList<T> list = new LinkedList<T>();

    foreach(var item in items)
    {
        list.AddLast(item);
        if (list.Count == size)
        {
            yield return list.ToList();
            list.RemoveFirst();
        }
    }
}

这样您就可以像这样简单地编写算法:

foreach(var window as collection.CreateRollingWindow(5))
{
    double rollingAverage = window.Average(); // window is IList<T> here
}

关于C# 循环遍历 IEnumerable 以进行使用前 n 个和后 n 个元素的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12150831/

相关文章:

c# - 输出多个查询

c# - 删除字符串中第一个字符的最快方法

node.js - 类型错误 : Object #<Promise> has no method 'forEach' mongodb

node.js - 在下一个命令之前完成整个循环/forEach

c# - 检查字符串是否在两个字母之间

c# - 使用 Reflection.Emit 创建的动态程序集崩溃,退出代码为 -532462766

python - 将元组附加到给定 id 的列表

list - 如何返回1到x之间的数字列表

python - 读取单个文件夹中的多个 .txt 文件

c# - 在条件范围内声明隐式类型变量并在外部使用它