C# 重新定义固定大小的质量

C# 重新定义固定大小的质量,c#,arrays,math,C#,Arrays,Math,我的数组大小为10。它必须包含传入参数的最后十个值(传入参数的数量接近3k)。我在以下循环中有一些逻辑: for (int i=0; i<incomingLength; i++) { //and here I also need to rewrite this array size of 10 with new incomingValue(i) } 对于(inti=0;i您可以使用“循环缓冲区”进行此操作 下面是一个示例实现(为简洁起见,省略了参数验证): 使用系统; 使用系统集合;

我的数组大小为10。它必须包含传入参数的最后十个值(传入参数的数量接近3k)。我在以下循环中有一些逻辑:

for (int i=0; i<incomingLength; i++)
{
 //and here I also need to rewrite this array size of 10 with new incomingValue(i)
}
对于(inti=0;i您可以使用“循环缓冲区”进行此操作

下面是一个示例实现(为简洁起见,省略了参数验证):

使用系统;
使用系统集合;
使用System.Collections.Generic;
使用系统诊断;
名称空间演示
{
公共类循环缓冲区:IEnumerable
{
///构造器。
///缓冲区的最大容量。
公共循环缓冲器(国际容量)
{
//这个+1的原因是为了简化逻辑-我们可以使用“front==back”来表示空缓冲区。
_缓冲区=新T[容量+1];
}
///缓冲区容量。
公共int容量
{
得到
{
返回_buffer.Length-1;
}
}
///当前存储在缓冲区中的元素数。
公共整数计数
{
得到
{
int结果=_back-_front;
如果(结果<0)
结果+=\u缓冲区长度;
返回结果;
}
}
///缓冲区是空的吗?
公共图书馆是空的
{
得到
{
返回此值。计数==0;
}
}
///缓冲区是否已满?(即是否已达到其容量?)
公共图书馆满了
{
得到
{
返回下一个批次(_back)==u front;
}
}
///清空缓冲区。
public void Empty()
{
_前=后=0;
Array.Clear(_buffer,0,_buffer.Length);//销毁所有旧引用,以便对其进行GCD。
}
///向缓冲区添加元素,如果缓冲区已满,则覆盖最旧的元素。
///要添加的元素。
公共无效添加(T newItem)
{
_缓冲区[_back]=新项目;
_后退=下一个批次(_后退);
如果(\u back==\u front)//缓冲区已满?
{
_front=nextSlot(_front);//碰撞正面,覆盖当前正面。
_缓冲区[_back]=默认值(T);//删除旧的前值。
}
}
/// 
///类型安全枚举数。元素按从最早到最新的顺序返回。
///这不是线程安全的,因此如果在另一个线程更改缓冲区时枚举缓冲区,则将运行该缓冲区
///因此,您必须使用自己的锁定方案来避免该问题。
/// 
公共IEnumerator GetEnumerator()
{
for(int i=\u front;i!=\u back;i=nextSlot(i))
收益率返回缓冲区[i];
}
///非类型安全枚举器。
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();//根据类型安全枚举器实现。
}
///计算指定插槽后面的插槽索引,必要时进行换行。
专用int nextSlot(int插槽)
{
返回(插槽+1)%\u缓冲区长度;
}
/// 
///缓冲区前面元素的索引。
///如果这等于_back,则缓冲区为空。
/// 
私人国际阵线;
/// 
///缓冲区最后使用的元素之外的第一个元素的索引。
///因此,这指示下一个添加的元素将去哪里。
/// 
私人INTU-back;
///基础缓冲区。其长度大于实际容量。
专用只读T[]_缓冲区;
}
内部课程计划
{
私家车
{
循环缓冲区=新的循环缓冲区(10);
对于(int i=0;i<20;++i)
添加(i);
foreach(缓冲区中的int n)
Console.WriteLine(n);//打印10..19
}
私有静态void Main()
{
新程序().run();
}
}
}
使用array.copy

var arr1 = new int[] { 1, 2, 3};
var arr2 = new int[] { 4, 5};

var target = new int[arr1.Length + arr2.Length];
Array.Copy(arr1, target, arr1.Length);
Array.Copy(arr2, 0, target, arr1.Length, arr2.Length);

这将组合两个数组。你可以根据自己的喜好修改索引

那么问题是什么?你问我们如何构建“反向迭代循环”?如果你使用“c#循环缓冲区”在互联网上搜索几十篇好文章 keywords@varocarbas无需反向迭代-只需从
incomingLength-10
@marcgravel开始,是的,当然。我这样说是为了用一种总结的方式说明这一点:)(因为仍然不知道这是否是OP想要的)谢谢你,马修-这是我正在寻找的。)我没有时间进行更多的调查,所以我只需做(计数>10){arr[i]=val[i];arr[i-1]=val[i-1];…}您的解决方案非常优雅)
var arr1 = new int[] { 1, 2, 3};
var arr2 = new int[] { 4, 5};

var target = new int[arr1.Length + arr2.Length];
Array.Copy(arr1, target, arr1.Length);
Array.Copy(arr2, 0, target, arr1.Length, arr2.Length);