如何确定数字所在的两个数组索引之间

时间:2014-04-10 04:12:40

标签: c# arrays

我已经有一些我工作的代码功能正常,但我觉得我是以非常钝的方式做的。

我有13个元素的固定大小数组。该数组从SQL表填充。如果给出一个数字,我想知道该数字属于哪两个数组索引。

例如:如果我的号码是500而且我有以下要素: -500,-400,-255,-89,77,243,409,575,741,907,1073,1500,2000

... 500将在元素6和7之间。(409和575)

我已经使用IF语句编写了一个相当强力的方法,下面的代码。我基本上创建了第二个数组,并使用IF语句来检查第一个数组的数字。注意 - 我忽略了数字大于max或min数组的情况。我搜索了一个可以在索引之间搜索无法获得的数组方法。关于如何更有效地做到这一点的任何想法?谢谢。

int[] deviations = new int[13] { -500, -400, -255, -89, 77, 243, 409, 575, 741, 907, 1073, 1500, 2000 };
int[] arrayCheck = new int[12];
Int64 num = 500;
Console.WriteLine("The number is: {0}", num);

if ((num >= deviations[0]) && (num < deviations[1]))
{arrayCheck[0] = 1;}
else { arrayCheck[0] = 0;}

if ((num >= deviations[1]) && (num < deviations[2]))
{arrayCheck[1] = 1;}
else { arrayCheck[1] = 0;}

if ((num >= deviations[2]) && (num < deviations[3]))
{ arrayCheck[2] = 1; }
else { arrayCheck[2] = 0; }

if ((num >= deviations[3]) && (num < deviations[4]))
{ arrayCheck[3] = 1; }
else { arrayCheck[3] = 0; }

if ((num >= deviations[4]) && (num < deviations[5]))
{ arrayCheck[4] = 1; }
else { arrayCheck[4] = 0; }

if ((num >= deviations[5]) && (num < deviations[6]))
{ arrayCheck[5] = 1; }
else { arrayCheck[5] = 0; }

if ((num >= deviations[6]) && (num < deviations[7]))
{ arrayCheck[6] = 1; }
else { arrayCheck[6] = 0; }

if ((num >= deviations[7]) && (num < deviations[8]))
{ arrayCheck[7] = 1; }
else { arrayCheck[7] = 0; }

if ((num >= deviations[8]) && (num < deviations[9]))
{ arrayCheck[8] = 1; }
else { arrayCheck[8] = 0; }

if ((num >= deviations[9]) && (num < deviations[10]))
{ arrayCheck[9] = 1; }
else { arrayCheck[9] = 0; }

if ((num >= deviations[10]) && (num < deviations[11]))
{ arrayCheck[10] = 1; }
else { arrayCheck[10] = 0; }

if ((num >= deviations[11]) && (num < deviations[12]))
{ arrayCheck[11] = 1; }
else { arrayCheck[11] = 0; }

int arrayIndex = Array.IndexOf(arrayCheck, 1);
Console.WriteLine("The num is between array indexes: {0} and {1}", arrayIndex, arrayIndex + 1);

3 个答案:

答案 0 :(得分:8)

如果对数组进行了排序,则可以使用Array.BinarySearch

int[] deviations = new int[13] { -500, -400, -255, -89, 77, 243, 409, 575, 741, 907, 1073, 1500, 2000 };
var index = Array.BinarySearch(deviations,500);
if(index >= 0)
{
    //Found at index 
}   
else
{
    int expectedindex = ~index;
    //Should fall in expectedindex 
}
  

Array.BinarySearch返回指定值的索引   指定的数组,如果找到值。如果找不到值且值为   数组中少于一个或多个元素,负数是   第一个元素的索引的按位补码   大于价值。如果未找到值且值大于任何值   数组中的元素,负数是按位数   补码(最后一个元素的索引加1)。

因此,当此方法返回负值时,表示找不到给定值。但是返回了元素的预期索引的bit-wise complement。通过将1到0和0的位表示更改为1来进行按位补码,我们使用~ operator将按位补码数转回原始值。

答案 1 :(得分:2)

您可以使用以下两个LINQ语句:

var previousIndex = deviations.Select((d, idx) => new { d, idx })
                              .Last(x => x.d <= num).idx;

var nextIndex = deviations.Select((d, idx) => new { d, idx })
                          .First(x => x.d >= num).idx;

如果您担心低于最小数字或高于最高数字,您可能希望使用LastOrDefault()FirstOrDefault()

答案 2 :(得分:0)

假设您的数组已经排序,您是否只是循环遍历数组?

(未经过测试的代码)

var foundIndex = -1;
for ( var i = 0; i < deviations.GetUpperBound(0); i++ )
{
    if ( num >= deviations[i] && num < deviations[i+1] )
    {
        foundIndex = i;
        break;
    }
}