我有以下数组:
double[] list = new double[] {0,0,100,100}
为什么我搜索29.6
我得到-3
?
Array.BinarySearch(list, 29.6)
我期待+1
或-1
。
返回参数的Array.BinarySearch()文档说:
指定数组中指定值的索引(如果找到值)。如果未找到值且值小于数组中的一个或多个元素,则为负数,它是第一个元素的索引的按位补码,其大于值。如果找不到值并且value大于数组中的任何元素,则为负数,它是(最后一个元素的索引加1)的按位补码。
但它对我说的并不多。
答案 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
我希望这会有所帮助。