みんなの答えはうまくいくでしょうが、私がこれを手に入れようとしていたところに正確にはありませんでした. もともと、私はというクラスのメソッドを持っていましたSort:
public void Sort<TKey>( Func<T, TKey> keySelector, . . . ) {
// . . .
}
これはうまくいきましたが、Sort メソッドを複数回呼び出すことに関連するバグが UI に見つかりました。並べ替え自体は機能しましたが、それは問題ではありませんでした。バグは複雑で説明が難しいので、私はそれについて詳しく説明したくありません。しかし、最も簡単な解決策は、コレクションが正しいキーで一度だけソートされるようにすることでした。問題は、コレクションがバインドされた特定のドロップダウンによってキーが異なることです。そのため、コレクション内の並べ替え基準をカプセル化して、最初で唯一の適切な並べ替えを行う方法が必要でした。
私はすでにSort
上記のメソッドを持っていたので、keySelector パラメーターをクラスのプロパティに入れるのが最も簡単だと考えました。言語ではそれができないことがわかりましたが、今ではその理由がわかり、理解しています。
これを機能させるために私が最終的に行ったことは、Func
プロパティを実装するオブジェクトへの参照に置き換えることでしIComparer<T>
た。T
このプロパティを宣言するのに問題はありません。また、コレクション宣言でパラメーターとして渡される型ごとにそれを実装するクラスを宣言するのは簡単です。コレクション オブジェクトを割り当てた後にプロパティを初期化し、Sort
メソッドを次のように書き直しました。
public void Sort() {
if ( Comparer != null ) {
InternalSort( Items.Skip( RowsToSkip ).OrderBy( item => item, Comparer ) );
} else {
InternalSort( Items.Skip( RowsToSkip ).OrderBy( item => item ) );
}
}
RowsToSkip
int
コレクションの先頭にある何行をスキップするかを指定するクラスのプロパティです。これにより、リストの先頭に「選択肢を選んでください」のようなエントリを追加し、並べ替えによって移動させないようにすることができます。