Array.IndexOf ,.索引超出范围异常

时间:2014-07-01 12:00:28

标签: c# arrays

我正在使用,

if(Array.IndexOf(myArray, otherArray[i+1]) > -1);

查看otherArray上的某个值是否在myArray中。我期望值为-1(如果值不在数组中)或索引位置(如果值)。我怎么得到一个IndexOutOFRange异常。

有人能指出我正确的方向。

溶液。嗨,雅各布,这就是我最初的想法,即i + 1超出了其他阵容的范围,但事实并非如此。这是代码的相关部分,

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

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

2 个答案:

答案 0 :(得分:1)

我唯一能想到的是otherArray [i + 1]不存在,你的索引肯定是正确的吗?尝试调试它并放入otherArray [x],x是你知道的东西,如果有效,那么你知道问题出在其他地方。

答案 1 :(得分:0)

我假设您在IndexOutOfRangeException获得otherArray[i+1],因为otherArray的大小等于或小于i。然后你应该这么做:

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

此外:

  

如果值不在数组

中,我期望值为-1

来自MSDN

返回值

  

整个数组中第一次出现值的索引if   发现; 否则,数组的下限减去1

如果对象不在数组中,那么你总是得不到-1。

  

由于大多数数组的下限为零,因此该方法会   通常在找不到值时返回-1。 在罕见的情况下   数组的下限等于Int32.MinValue而值不是   发现,此方法返回Int32.MaxValue,即   System.Int32.MinValue - 1

您可以使用Array.CreateInstance创建一个下限不是0的数组。

为什么不使用Enumerable.Contains来提高可读性:

if(myArray.Contains(otherArray.ElementAtOrDefault(i+1)))
{
    // ...
}