我已经有一些我工作的代码功能正常,但我觉得我是以非常钝的方式做的。
我有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);
答案 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;
}
}