11

IComparableを実装するクラスがあります。

public class MyClass : IComparable<MyClass>
{
    public int CompareTo(MyClass c)
    {
        return this.whatever.CompareTo(c.whatever);
    }

    etc..
}

次に、クラスのジェネリックリストのsortメソッドを呼び出すことができます

List<MyClass> c = new List<MyClass>();
//Add stuff, etc.

c.Sort();

比較者に従ってリストを並べ替えます。

ユーザーがコレクションをさまざまな方法で並べ替えられるようにするために、MyClassの他のプロパティに従ってコレクションをさまざまな方法で並べ替えるために、さらに比較子を指定するにはどうすればよいですか?

4

4 に答える 4

14

クラスで並べ替えを設定するには:

public static Comparison<MyClass> OtherComparison = delegate(MyClass object1, MyClass object2)
{
    return object1.Whatever.CompareTo(object2.Whatever);
};

次に、新しい比較を使用して並べ替えます。

List<MyClass> myClassList = new List<MyClass>();
myClassList.Sort(MyClass.OtherComparison);

あなたが明らかに空のリストをソートしたくないことを除いて:)

于 2010-03-19T19:45:52.193 に答える
9

特定の比較子を引数としてSortを呼び出すことができます。参照:MSDN

于 2010-03-19T19:43:33.243 に答える
3

IComparer<T>その方向への1つのステップは、 (ただし、ではなく)を指定できるSortオーバーロードを使用することですIComparable<T>

すでに多くの実装がある場合は、 2つのインスタンスを比較IComparable<T>する汎用実装を作成するのは簡単です。実際、そのようなクラスがBCLにまだ存在していないことに少し驚いていますが、見つけることができませんでした。IComparer<T>IComparable<T>

Comparer<T>.Default近づいていますが、完全ではありません。

于 2010-03-19T19:51:42.717 に答える
2

オブジェクトのリストを並べ替える方法が複数ある場合は、明らかに、選択するオプションを指定する必要があります。これが、Sortの他のオーバーライドが適していることです。IComparerとComparisonをご覧ください。

于 2010-03-19T19:46:24.680 に答える