Array.BinarySearch没有使用IComparable查找项目

时间:2010-05-29 04:21:05

标签: c# arrays search

如果二进制搜索需要预先对数组进行排序,为什么以下代码有效?

string[] strings = new[] { "z", "a", "y", "e", "v", "u" };
int pos = Array.BinarySearch(strings, "Y", StringComparer.OrdinalIgnoreCase);           
Console.WriteLine(pos);

为什么这段代码会返回-1?

 public class Person : IComparable<Person> {

    public string Name { get; set; }
    public int Age { get; set; }


    public int CompareTo(Person other) {
        return this.Age.CompareTo(other.Age) + this.Name.CompareTo(other.Name);
    }
}
var people = new[] {

                new Person { Age=5,Name="Tom"},
                new Person { Age=1,Name="Tom"},
                new Person { Age=2,Name="Tom"},
                new Person { Age=1,Name="John"},
                new Person { Age=1,Name="Bob"},
            };


            var s = new Person { Age = 1, Name = "Tom" };

            // returns -1
            Console.WriteLine(
                Array.BinarySearch(people, s)
            );

1 个答案:

答案 0 :(得分:2)

如果违反the pre-condition(“数组的元素必须已根据comparer定义的排序顺序按递增值排序;否则,结果可能不正确。”),导致未定义的行为,有时包括,“嘿,它看起来有效。”在免费和许多其他编程错误之后使用也是如此。

我并不感到惊讶它适用于那个输入,因为“y”和“e”都是同样的中间元素。它使用匹配的中间的“y”。如果您尝试:

string[] strings = new[] { "z", "a", "y", "e", "e", "v", "u" };

你会发现这不起作用。请注意,元素数量奇数。目标在中间之前,而应该在之后。