BinarySearch メソッドの動作を文書化したMSDN ページは、検索される配列と値の両方が IComparable を実装している可能性があることを示しています。
1) ページの説明
のいずれか
value
またはすべての要素が 、比較に使用されるインターフェイスをarray
実装する必要があります。IComparable
2) さらに、メソッドはInvalidOperationException
ifをスローします
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
配列内の要素の代わりに、値のコンパレーターを実行するにはどうすればよいですか?