代码之家  ›  专栏  ›  技术社区  ›  Razor

array.binarysearch找不到使用IComparable的项

  •  0
  • Razor  · 技术社区  · 16 年前

    如果二进制搜索需要在手工前对数组进行排序,那么为什么下面的代码可以工作?

    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 回复  |  直到 16 年前
        1
  •  2
  •   Matthew Flaschen    16 年前

    如果你违反了 the pre-condition (“数组元素必须按照比较器定义的排序顺序以递增的值排序,否则结果可能不正确。”)会导致未定义的行为,有时包括“嘿,它看起来工作正常。”在释放和许多其他编程错误后使用也是如此。

    对于这个输入,我并不感到惊讶,因为“y”和“e”都是相同的中间元素。它使用中下“y”,与之匹配。如果你尝试:

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

    你会发现这行不通。注意有奇数个元素。目标在中间之前,而应该在后面。