我正在使用,
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;
}
我希望这是所有相关的代码。
答案 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)))
{
// ...
}