Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 索引超出数组错误的界限_C#_Arrays - Fatal编程技术网

C# 索引超出数组错误的界限

C# 索引超出数组错误的界限,c#,arrays,C#,Arrays,我正在编写一个算法,我正在使用自定义数据数组,如果看起来有点奇怪的话,我正在为期货交易平台编写算法,因此它们可能有一些看起来不标准的C#函数 我正在尝试调整数组的大小,因为我需要在每次发现要添加的新值时调整数组的大小,然后在设置最后一个值后的接下来5个值内再次找到更好的值时,我有时会使用SetValue替换找到的最后一个值 问题是,当我在Visual Studio中调试它时,它在ArrayResize之后的第行停止,当我将鼠标悬停在LastLSwDMIpriceBar[k]上时,它显示了k=0,

我正在编写一个算法,我正在使用自定义数据数组,如果看起来有点奇怪的话,我正在为期货交易平台编写算法,因此它们可能有一些看起来不标准的C#函数

我正在尝试调整数组的大小,因为我需要在每次发现要添加的新值时调整数组的大小,然后在设置最后一个值后的接下来5个值内再次找到更好的值时,我有时会使用SetValue替换找到的最后一个值

问题是,当我在Visual Studio中调试它时,它在ArrayResize之后的第行停止,当我将鼠标悬停在LastLSwDMIpriceBar[k]上时,它显示了k=0,正如我预期的那样,因为它将是一个数组中的第一个元素,那么什么索引在数组的边界之外呢

我理解并希望代码的工作方式是:当通过将LSwDMIbool设置为true来满足条件时,数组的大小将从0调整为1个元素,然后将索引为[0]的元素设置为LastLSwDMIpriceBar[k]。我错了吗

任何帮助都将不胜感激

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));
}