为什么Array.BinarySearch()给出负数?

我有一些对我没有多大意义的代码。 我有一个字符串数组,我正在使用二进制搜索在foreach()循环中计算它们。 除了排序之外,我尝试输出时的代码完全相同。 我不确定为什么我得到了我得到的结果。 我认为它应该只计算数组值的时间。 有帮助吗?

码:

using System; public class Driver { public static void Main(string [] args) { String [] s = {"Bob", "Jane", "Will", "Bill", "Liz"}; Console.WriteLine("Before Sorting:\n----------"); foreach(string item in s) { Console.WriteLine("{0}. {1}", Array.BinarySearch(s, item) + 1, item); } Console.WriteLine("Will is at position {0}", Array.BinarySearch(s, "Will") + 1); Console.WriteLine("\n\nAfter Sorting:\n----------"); Array.Sort(s); foreach(string item in s) { Console.WriteLine("{0}. {1}", Array.BinarySearch(s, item) + 1, item); } Console.WriteLine("Will is at position {0}", Array.BinarySearch(s, "Will") + 1); } } 

输出:

 Before Sorting: ---------- 1. Bob 2. Jane 3. Will 0. Bill -2. Liz Will is at position 3 After Sorting: ---------- 1. Bill 2. Bob 3. Jane 4. Liz 5. Will Will is at position 5 

我确定这是完全愚蠢的事情,但我无法弄清楚。

二进制搜索仅适用于已排序的数组。 它没有找到价值:

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

Array.BinarySearch要求对数组进行排序。 从文档:

此方法不支持搜索包含负索引的数组。 必须在调用此方法之前对数组进行排序。

它将通过设计返回负值:

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

二进制搜索适用于排序数组。 您的数组未排序,因此您可以按预期获得随机结果。