独自に定義した型は通常そのままではソートできません。 この場合、ソートができないことを表す例外InvalidOperationExceptionがスローされます。
Array.Sortでソートできない場合
using System;
// 独自に定義した型
class Account {
public string Name;
public Account(string name)
{
this.Name = name;
}
}
class Sample {
static void Main()
{
// ソート対象の配列
var arr = new Account[] {new Account("Bob"), new Account("Alice"), new Account("Charlie")};
// ソート
Array.Sort(arr);
}
}
実行結果
System.InvalidOperationException: 配列にある 2 つの要素を比較できませんでした。 ---> System.ArgumentException: 少なくとも 1 つのオブジェクトで IComparable を実装しなければなりません。 場所 System.Collections.Comparer.Compare(Object a, Object b) 場所 System.Collections.Generic.ObjectComparer`1.Compare(T x, T y) 場所 System.Collections.Generic.ArraySortHelper`1.SwapIfGreaterWithItems(T[] keys, IComparer`1 comparer, Int32 a, Int32 b) 場所 System.Collections.Generic.ArraySortHelper`1.QuickSort(T[] keys, Int32 left, Int32 right, IComparer`1 comparer) 場所 System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer) --- 内部例外スタック トレースの終わり --- 場所 System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer) 場所 System.Array.Sort[T](T[] array, Int32 index, Int32 length, IComparer`1 comparer) 場所 System.Array.Sort[T](T[] array) 場所 Sample.Main()
これはソート対象の大小関係が定義されていないために発生します。 ソートを行うためにはソート対象の大小関係が比較できなければなりませんが、上記の例ではAccountクラスの大小関係がどこにも定義されておらず比較ができないため、ソートの際に例外が発生しています。
Array.Sortメソッドでソートを行うには、ソート対象の型にIComparable<T>(またはIComparable)インターフェイスを実装するか、あるいはSortメソッドの引数にIComparer<T>(またはIComparer)インターフェイス、もしくはComparison<T>デリゲートを指定する必要があります。
詳しくは複合型のソート・複数キーでのソートを参照してください。 また個々のインターフェイスとその実装方法については大小関係の定義と比較を参照してください。