数组中.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;
                            }

我希望这是所有相关的代码。

数组中.IndexOf,.索引范围异常

我唯一能想到的是otherArray[i+1]不存在,你肯定有你的索引正确吗?试着调试它,并把otherArray[x], x是你知道存在的东西,如果这工作,那么你知道问题在别处

我假设您在otherArray[i+1]处获得IndexOutOfRangeException,因为otherArray的大小等于或小于i。那么你应该检查一下:

if(otherArray.Length > i+1 && Array.IndexOf(myArray, otherArray[i+1]) != -1)
{
    // ...
}

:

如果值不在数组

中,我期望的值是-1
从MSDN:

返回值

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)))
{
    // ...
}