我发现自己经常处理一个 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/