Array.BinarySearch()返回值

时间:2012-07-11 15:31:31

标签: c# .net

我有以下数组:

double[] list = new double[] {0,0,100,100}

为什么我搜索29.6我得到-3

Array.BinarySearch(list, 29.6)

我期待+1-1

返回参数的Array.BinarySearch()文档说:

  

指定数组中指定值的索引(如果找到值)。如果未找到值且值小于数组中的一个或多个元素,则为负数,它是第一个元素的索引的按位补码,其大于值。如果找不到值并且value大于数组中的任何元素,则为负数,它是(最后一个元素的索引加1)的按位补码。

但它对我说的并不多。

3 个答案:

答案 0 :(得分:11)

  

如果未找到值且值小于数组中的一个或多个元素,则为负数,它是第一个元素的索引的位积补码,大于值。

第一个大于29.6的元素是100,其索引为2

~2-3

答案 1 :(得分:6)

您可以使用'〜'来获取按位补码,这将为您提供大于搜索项的第一项的索引。

  

如果Array不包含指定的值,则返回该方法   负整数。你可以应用按位补码运算符(〜)   到负面结果(在Visual Basic中,Xor为负面结果)   -1)产生索引。如果此索引大于或等于数组的大小,则没有大于值的元素   阵列。否则,它是第一个元素的索引更大   而不是价值。

来自MSDN

因此,如果你有:

var pos = Array.BinarySearch(list, 29.6);

您可以查看:

if (pos < 0)
{
     Console.WriteLine("Not found, the result was {0} which is index {1}", pos, ~pos);
}

在您的情况下,这意味着您的-3会指示索引2是第一个大于搜索目标的项目。

答案 2 :(得分:1)

这是你的答案: “负数,它是第一个元素的索引的按位补码,大于值。”

所以在你的情况下,你的搜索值(29.6)小于100,这是数组列表中的第3个元素,3的补码是-3,这就是你得到的答案。

这里我扩展了你的例子并创建了另一个带有一些不同值的数组列表(list2),然后我搜索了与你相同的值29.6,现在这个29.6值小于100但大于25,并且在我的数组列表100中打开位置4及其补码为-4。

所以我得到结果-4,如果我在数组列表中搜索了20,我会得到答案-3。

 double[] list = new double[] { 0, 0, 100, 100 };
        double[] list2 = new double[] { 10, 15, 25, 100 };

        int result = Array.BinarySearch(list, 29.6);
        int result2 = Array.BinarySearch(list2, 29.6);

        Response.Write("Your answer result:" + result.ToString() + "<br/>");
        Response.Write("Your answer result2:" + result2.ToString());

我的代码结果:

            Your answer result : -3
            Your answer result2: -4 

我希望这会有所帮助。