C# 索引超出数组错误的界限
我正在编写一个算法,我正在使用自定义数据数组,如果看起来有点奇怪的话,我正在为期货交易平台编写算法,因此它们可能有一些看起来不标准的C#函数 我正在尝试调整数组的大小,因为我需要在每次发现要添加的新值时调整数组的大小,然后在设置最后一个值后的接下来5个值内再次找到更好的值时,我有时会使用SetValue替换找到的最后一个值 问题是,当我在Visual Studio中调试它时,它在ArrayResize之后的第行停止,当我将鼠标悬停在LastLSwDMIpriceBar[k]上时,它显示了k=0,正如我预期的那样,因为它将是一个数组中的第一个元素,那么什么索引在数组的边界之外呢 我理解并希望代码的工作方式是:当通过将LSwDMIbool设置为true来满足条件时,数组的大小将从0调整为1个元素,然后将索引为[0]的元素设置为LastLSwDMIpriceBar[k]。我错了吗 任何帮助都将不胜感激C# 索引超出数组错误的界限,c#,arrays,C#,Arrays,我正在编写一个算法,我正在使用自定义数据数组,如果看起来有点奇怪的话,我正在为期货交易平台编写算法,因此它们可能有一些看起来不标准的C#函数 我正在尝试调整数组的大小,因为我需要在每次发现要添加的新值时调整数组的大小,然后在设置最后一个值后的接下来5个值内再次找到更好的值时,我有时会使用SetValue替换找到的最后一个值 问题是,当我在Visual Studio中调试它时,它在ArrayResize之后的第行停止,当我将鼠标悬停在LastLSwDMIpriceBar[k]上时,它显示了k=0,
private int k, l;
private int[] LastLSwDMIpriceBar;
LastLSwDMIpriceBar = new int [1];
.....
if (LSwDMIbool)
{
lastLSwDMIbar = CurrentBar - 2 - LowestBar(LSwDMI, 5);
LastLSwDMI[0] = DMI(Closes[2], Convert.ToInt32(DmiPeriod)).Values[0].GetValueAt(lastLSwDMIbar);
Array.Resize(ref LastLSwDMIpriceBar, l++);
LastLSwDMIpriceBar[k] = CurrentBar - LowestBar(Lows[2], 5);
k++;
LSwDMIprice[0] = Lows[2].GetValueAt(LastLSwDMIpriceBar[k]);
}
......
if(!LSwDMIbool)
{
for (int LastBar = CurrentBar - 1; IsFirstTickOfBar && LastBar <= lastLSwDMIbar + 5; LastBar++)
LastLSwDMIpriceBar.SetValue((CurrentBar - LowestBar(Lows[2], 5)), k);
}
private int k,l;
私有int[]LastLSwDMIpriceBar;
LastLSwDMIpriceBar=newint[1];
.....
if(LSwDMIbool)
{
lastLSwDMIbar=当前巴-2-最低巴(LSwDMI,5);
LastLSwDMI[0]=DMI(关闭[2],将.Convert.ToInt32(dmiperion)).Values[0].GetValueAt(lastLSwDMIbar);
Resize(ref LastLSwDMIpriceBar,l++);
LastLSwDMIpriceBar[k]=当前条-最低条(最低[2],5];
k++;
LSwDMIprice[0]=低位[2]。GetValueAt(LastLSwDMIpriceBar[k]);
}
......
如果(!LSwDMIbool)
{
对于(int-LastBar=CurrentBar-1;IsFirstTickOfBar&&LastBar,您可能会发现以下内容非常有用:
我相信您希望++l
而不是l++
,以便在调整数组大小时使用l
的新值。我怀疑l
在第一次数组时为零。调用Resize
后,数组大小将调整为零
我正在尝试调整数组的大小,因为每次发现要添加新值时,我都需要调整数组的大小
不要为此使用数组!
相反,请使用列表
private int k,l;
private List LastLSwDMIpriceBar=新列表();
.....
if(LSwDMIbool)
{
lastLSwDMIbar=当前巴-2-最低巴(LSwDMI,5);
LastLSwDMI[0]=DMI(关闭[2],将.Convert.ToInt32(dmiperion))。值[0][lastLSwDMIbar];
var newValue=CurrentBar—最低位Bar(低位[2],5%);
LastLSwDMIpriceBar.Add(newValue);
k++;
LSwDMIprice[0]=低位[2][newValue];
}
......
如果(!LSwDMIbool)
{
对于(int LastBar=CurrentBar-1;IsFirstTickOfBar&&LastBar)来说,为了澄清为什么这样做:在方法中使用l++
作为参数,将首先使用l
的值来调用方法,在您的情况下,该方法是Array.Resize(…)
然后l
的值将增加1
。因此在第一次迭代中数组。调整大小(…)使用0
++l
的值调用,其工作方式略有不同。它首先将l
增加1
,然后将l
的新值传递给方法。因此在第一次迭代中数组。调整大小(…)
将被调用,其值为1
。正是这样,谢谢!第一个上界确实被打印为-1,因此++l是我所需要的,并帮助我发现我的k++也需要进一步向下。嗨,Joel。谢谢你的回答,但你能解释一下在这种情况下为什么宁愿使用列表而不是数组吗?它到目前为止似乎还可以工作。我仍然需要查看是否获得了预期的数据,但是代码按原样运行,数组会随着每个新数据而变化,那么会出现什么问题呢?谢谢Array.Resize()在后台分配一个全新的内存块,并逐个复制每个元素。List
使用缓冲区来最大限度地减少这种情况发生的频率。它还通过添加项来构建,作为设计意图的一部分,其中阵列的设计意图是它们的大小是固定的。因此,基本上,这将是一个性能问题,然后呢如果我使用List,我会认为我会使用List.Insert(索引,T)修改最后一个值,而不是使用数组修改SetValue,但我发现您的做法有所不同。这是更改列表值的另一种方式吗?性能只是其中的一部分。这正是设计用于的作业列表,我怀疑如果我们能看到更多的代码,我们可以使用它们来大大简化它。列表可以使用相同的[]
表示为数组,但也有添加新项目的Add()
方法。几乎没有人将GetValue()
或SetValue()
用于数组。
private int k, l;
private List<int> LastLSwDMIpriceBar = new List<int>();
.....
if (LSwDMIbool)
{
lastLSwDMIbar = CurrentBar - 2 - LowestBar(LSwDMI, 5);
LastLSwDMI[0] = DMI(Closes[2], Convert.ToInt32(DmiPeriod)).Values[0][lastLSwDMIbar];
var newValue = CurrentBar - LowestBar(Lows[2], 5);
LastLSwDMIpriceBar.Add(newValue);
k++;
LSwDMIprice[0] = Lows[2][newValue];
}
......
if(!LSwDMIbool)
{
for (int LastBar = CurrentBar - 1; IsFirstTickOfBar && LastBar <= lastLSwDMIbar + 5; LastBar++)
LastLSwDMIpriceBar[k] = CurrentBar - LowestBar(Lows[2], 5));
}