ArrayList BinarySearch

时间:2010-02-23 10:08:04

标签: c# collections arraylist

我正忙着准备MCTS 70-536考试,根据考试书(Microsoft Press - .NET Framework - 应用程序开发基础自学训练套件第2版),此代码示例:

ArrayList al = new ArrayList();
al.AddRange(new string[] { "Hello", "world", "this", "is", "a", "test" });
Console.WriteLine(al.BinarySearch("this"));

将值'2'输出到控制台,因为项'this'位于索引2.同意这是我运行该代码时得到的输出。

但是如果我跑

Console.WriteLine(al.BinarySearch("world"));

我希望在控制台中获得值1,因为'world'将在索引1处,但是我得到值-7?

有人可以解释一下这是如何运作的吗?

由于

4 个答案:

答案 0 :(得分:11)

您正在执行二进制搜索的数组未排序。这是BinarySearch运行的要求。

没有排序,混淆搜索算法,并让它认为“世界”应该在第7位,但它不在数组中:结果是-7。

答案 1 :(得分:3)

直接从ArrayList.BinarySearch(http://msdn.microsoft.com/en-us/library/5tzt7yz3%28VS.85%29.aspx

的MSDN文档中获取
  

value参数和每个元素   的ArrayList必须实现   IComparable接口,使用   比较。的元素   ArrayList必须已经排序   根据排序增加价值   IComparable定义的订单   实施;否则,结果   可能不正确。

答案 2 :(得分:1)

问题已经回答,但添加了这个以供参考。

BinarySearch将使用排序算法查找项目。在您的示例中,默认排序是按字母顺序排列的,因此“world”应该是last,因此为7。

您将看到BinarySearch的上传器,它接受IComparer对象。不提供这个提供默认的字母顺序。

但如果您按照本书的建议实现了“reverseSort”方法,那么您需要将BinarySearch函数传递给“reverseSort”对象。

喜欢这个;

Console.WriteLine(al.BinarySearch(al, new reverseSort()));

同样正如我发现如果你实现“reverseSort”类并执行一个console.writeline来进行比较,它的结果并不像我期望的那样。我花了一点时间试图找出算法是什么。

答案 3 :(得分:0)

来自documentation

  

基于零的价值指数   如果找到值,则排序ArrayList;   否则,负数,即   指数的按位补码   下一个大于的元素   值,或者,如果没有更大   元素,按位的补码   计数。

请注意已排序字。