2013-10-07 62 views
0

MSDN page記錄了BinarySearch的方法的行爲顯示調用IComparable的 ,無論是陣列和被搜索可以實現IComparable的值: 如何執行Array.BinarySearch

1)頁描述

valuearray的每個元素都必須實現IComparable 接口,該接口用於比較。

2)另外,該方法將引發InvalidOperationException如果

value不實現IComparable接口,並且搜索 遇到不實現IComparable 接口的元件。

我試圖證明這種行爲(使用IComparable接口的值),但無法。這裏是我的代碼:

// Declarations 
class Many 
{ 
    public string data { get; set; } 
} 
class One : Many, IComparable<Many> 
{ 
    public int CompareTo(Many other) 
    { 
     Console.WriteLine("Comparator of One invoked"); 
     if (this.data.Length < other.data.Length) return -1; 
     if (this.data.Length > other.data.Length) return 1; 
     return 0; 
    } 
} 
... 
// action 
    Many[] manies = new[] { new Many { data = "1" }, 
          new Many { data = "22" }, 
          new Many { data = "333" }, 
          new Many { data = "4444" }, }; 
    One one = new One {data="333"}; 
    Console.WriteLine(Array.BinarySearch(manies, one)); 

當我運行此我得到一個System.InvalidOperationException,而如果value沒有實現IComparable根據文檔應該發生。但在我看來,它確實實施了IComparable

如何獲取要運行的值的比較器,而不是數組中的元素?

+0

您需要繼承IComparable接口在很多類,而不是一類。將基類對象與派生類對象進行比較的唯一有意義的方法。 –

回答

2

現在我明白了這個問題,將One的實現更改爲IComparable而不是IComparable<Many>。看看文檔,我認爲這是缺失的組件。如果需要,您可以實現兩者,但Array.BinarySearch將不使用接口IComparable<T>

此代碼爲我工作:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace TestProject 
{ 
    public class NoCompare 
    { 
     public string V 
     { 
      get; 
      set; 
     } 
    } 

    public class Compare : IComparable 
    { 
     public string V 
     { 
      get; 
      set; 
     } 

     public int CompareTo(object obj) 
     { 
      NoCompare a = obj as NoCompare; 

      if (a == null) 
       return -1; 

      return String.Compare(V, a.V); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      NoCompare[] strings = new NoCompare[] { new NoCompare() { V = "a" }, new NoCompare() { V = "b" }, new NoCompare() { V = "c" } }; 

      Compare t = new Compare(); 
      t.V = "b"; 

      Array.BinarySearch((object[])strings, t); 
     } 
    } 
} 
+0

我的不好。我完全誤解了這個問題。 – mageos

+0

我已更新答案以更好地解決您的特定問題。 – mageos

+0

@Mishax:我也是這麼做的,它工作得很好。 – Jon