数组中.IndexOf,.索引范围异常
本文关键字:范围 异常 索引 IndexOf 数组 | 更新日期: 2023-09-27 18:10:53
我使用
if(Array.IndexOf(myArray, otherArray[i+1]) > -1);
查看otherArray上的值是否在myArray中。如果值不在数组中,则期望值为-1,如果在索引位置,则期望值为-1。我是如何得到一个indexoutorange异常的。
谁能给我指一下正确的方向?
补充道。嗨,雅各布,这就是我一开始的想法,我+1是一个超出了otherArray的范围,但它不是。以下是相关的代码,
// Add values to Level list
levels.Add(r3);
levels.Add(r2);
levels.Add(r1);
levels.Add(pp);
levels.Add(s1);
levels.Add(s2);
levels.Add(s3);
if((r3-r2) > 50*TickSize)
{
levels.Add((r2+(r3-r2)/3));
levels.Add((r2+(r3-r2)*2/3));
}
else if((r3-r2) > psb)
levels.Add((r2+(r3-r2)/2));
if((r2-r1) > 50*TickSize)
{
levels.Add((r1+(r2-r1)/3));
levels.Add((r1+(r2-r1)*2/3));
}
else if((r2-r1) > psb)
levels.Add((r1+(r2-r1)/2));
if((r1-pp) > 50*TickSize)
{
levels.Add((pp+(r1-pp)/3));
levels.Add((pp+(r1-pp)*2/3));
}
else if((r1-pp) > psb)
levels.Add((pp+(r1-pp)/2));
if((pp-s1) > 50*TickSize)
{
levels.Add((s1+(pp-s1)/3));
levels.Add((s1+(pp-s1)*2/3));
}
else if((pp-s1) > psb)
levels.Add((s1+(pp-s1)/2));
if((s1-s2) > 50*TickSize)
{
levels.Add((s2+(s1-s2)/3));
levels.Add((s2+(s1-s2)*2/3));
}
else if((s1-r2) > psb)
levels.Add((s2+(s1-s2)/2));
if((s2-s3) > 50*TickSize)
{
levels.Add((s3+(s2-s3)/3));
levels.Add((s3+(s2-s3)*2/3));
}
else if((s2-s3) > psb)
levels.Add((s3+(s2-s3)/2));
}
pivots[6] = r3; // Puts Pivots into array
pivots[5] = r2;
pivots[4] = r1;
pivots[3] = pp;
pivots[2] = s1;
pivots[1] = s2;
pivots[0] = s3;
pivots[7] = Closes[mBIP][0];
levels.Add (High[0]);
double[] lev = levels.ToArray();
Array.Sort (lev);
i = Array.BinarySearch(lev,High[0]); //finds the Array index of current High
if(High[0] >= r3 && Close[0] > lev[i-1] && pStop.StopPrice < Math.Max(lev[i-1],High[0]-10*TickSize))
{
pStop = ExitLongStop(0, true,Position.Quantity, Math.Max(lev[i-1], High[0]-10*TickSize), "Stop of Long", "pEntry");
target = Math.Max(High[0]+1*TickSize, r3+10*TickSize );
fillBar = CurrentBar;
}
else if(High[0] >= lev[i+1]-(Math.Max(2*TickSize,(lev[i+1] - pivots[Array.IndexOf(pivots, lev[i+1])-1])*0.1)) && Array.IndexOf(pivots, lev[i+1]) > -1 && Close[0] > lev[i-1] && pStop.StopPrice < lev[i-1]) // Checks to see if High[] is within 2 ticks of Major Pivot or 10% of Major pivot range
{
pStop = ExitLongStop(0, true,Position.Quantity, lev[i-1], "Stop of Long", "pEntry");
target = lev[i+2];
fillBar = CurrentBar;
}
我希望这是所有相关的代码。
我唯一能想到的是otherArray[i+1]不存在,你肯定有你的索引正确吗?试着调试它,并把otherArray[x], x是你知道存在的东西,如果这工作,那么你知道问题在别处
我假设您在otherArray[i+1]
处获得IndexOutOfRangeException
,因为otherArray
的大小等于或小于i
。那么你应该检查一下:
if(otherArray.Length > i+1 && Array.IndexOf(myArray, otherArray[i+1]) != -1)
{
// ...
}
也:
从MSDN: 返回值如果值不在数组
中,我期望的值是-1
value在整个数组中第一次出现的索引发现;,否则为数组的下界减1。
如果对象不在数组中,你不会总是得到-1
由于大多数数组的下界为0,因此此方法可以当没有找到值时通常返回-1。在极少数情况下数组的下界等于Int32。MinValue和value不是这个方法返回Int32。MaxValue,即System.Int32。MinValue - 1.
可以使用Array.CreateInstance
创建下界不是0的数组。
你为什么不使用Enumerable.Contains
,这也增加了可读性:
if(myArray.Contains(otherArray.ElementAtOrDefault(i+1)))
{
// ...
}