Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C二进制搜索返回负索引_C#_Arrays - Fatal编程技术网

C# C二进制搜索返回负索引

C# C二进制搜索返回负索引,c#,arrays,C#,Arrays,今天,我对二进制搜索很感兴趣。我听说这是在大数组中查找索引的最快方法。所以我决定编写代码,看看如果没有我正在搜索的索引,我是否会得到一个异常 int[] longArray = new int[1000]; Random rnd = new Random(); for (int i = 0; i < longArray.Length; i++) { longArray[i] = rnd.Next(1, 1000); } Array.Sort(longArray);

今天,我对二进制搜索很感兴趣。我听说这是在大数组中查找索引的最快方法。所以我决定编写代码,看看如果没有我正在搜索的索引,我是否会得到一个异常

int[] longArray = new int[1000];
Random rnd = new Random();

for (int i = 0; i < longArray.Length; i++)
{
    longArray[i] = rnd.Next(1, 1000);
}

Array.Sort(longArray);            

int indexOfMyNum = Array.BinarySearch(longArray, 706);
Console.WriteLine("Here it is: " +  indexOfMyNum);
有趣的是,也不例外,我的程序总是返回一个负数。我知道random没有必要看到这种行为,但我想在更大的阵列上测试它。现在我的问题是,为什么m'I得到的是负指数而不是一个例外。如果我错了,请纠正我,因为数组的索引与内存地址直接相关,这是否意味着BinarySearch正在查看不允许他查看的内存片段,以查看我的编号是否存在


有人知道为什么会发生异常而不是异常吗?

解释了其中的奥秘:

返回值

类型:System.Int32

指定数组中指定值的索引(如果找到值);否则为负数。如果未找到值且值小于数组中的一个或多个元素,则返回的负数是大于值的第一个元素的索引的位补码。如果找不到值且值大于数组中的所有元素,则返回的负数是最后一个元素的索引加1的位补码。如果使用未排序的数组调用此方法,则返回值可能不正确,并且可能返回负数,即使数组中存在值也是如此。重点补充

这意味着您的程序正在搜索数组中不存在的值,并获取插入位置的按位补码,即负数


有人知道为什么它会发生而不是异常吗

非常坦率地说,之所以会发生这种情况,是因为在集合中找不到项目并不是一种例外情况。毕竟,我们经常寻找一个项目只是为了看看它是否存在。BinarySearch方法return输入负数符合此要求,因为调用者总是可以告诉项目是否存在,如果不存在,插入的位置是什么:

int indexOfMyNum = Array.BinarySearch(longArray, 706);
if (indexOfMyNum < 0) {
    int insertionPos = ~indexOfMyNum;
    Console.WriteLine("The number is not there; insert at {0}", insertionPos);
}

负返回表示该值介于数组中的值之间或超出数组的范围:

int indexOfMyNum = Array.BinarySearch(longArray, 706);

if (indexOfMyNum == -1)
  Console.WriteLine("The value is less than any item in the array");
else if (indexOfMyNum == -indexOfMyNum.Length - 1) 
  Console.WriteLine("The value is bigger than any item in the array");
else if (indexOfMyNum < 0)
  Console.WriteLine("The value is between [{0}..{1}]", ~indexOfMyNum - 1, ~indexOfMyNum);
else // exact match
  Console.WriteLine("Here it is: " +  indexOfMyNum);

是否有人知道它为什么会发生而不是异常?在我的编程教育的这个阶段,我想不出这个案例的用法。如果我想在数组中找到第一个更大的数字,而不写if语句,那么我可能会这样做。这可能是背后的原因吗?СПаззззззз,эж,чж!