コンパイラって

偉大だな、とか思ったりw
FastPropertyComparerでNullableも特別なサポートが必要だってわかった。メンドー。
普段使ってるのはNullableジェネリック構造体。比較はNullableクラスにあるCompare。

public struct Nullable where T : struct
public static class Nullable

この2つがある。…知らなかった。FastPropertyComparerで特別サポートが必要なのは作りのせいです。念のため。

LINQOrderBy もあるし、WPFはデータバインディングでソートを普通にサポートしてるって知ってしまったし、ほとんど使い道がないのにまだ作り続けているオレガイル…。

唯一こんなソートが簡単に作れるのが良いところ。Ageで降順、Ageが同じならNameで昇順のソート。

list.Sort( FastPropertyComparer.Factory<Employee>(
  new SortDescription[] {
    new SortDescription( "Age", ListSortDirection.Descending ),
    new SortDescription( "Name" ) } ) );

プロパティ名の解決がコンパイル時じゃなく実行時だからいまいちなんだけど、WPFも一緒だからまあいいや。

IBindingListView.ApplySortから呼ばれる処理も書いたけど、何をどうすればIBindingListViewの方のApplySortが呼ばれるのかわからなかったり。これ、DataGridViewを操作すれば呼べるんでしょうか?ご存知の方、教えてください。

nullableの比較が正しくできない、現在のソースを見たい奇特な方は↓からどうぞ。(追記:Nullable修正版に差し替えました)
http://siokoshou.googlepages.com/FastPropertyComparer.cs

それにしても.NETの勉強になるなぁ。と慰めてみたり。

(5/14追記)
なぜNullableのサポートが必要になったのか、そのあたりを追記。
FastPropertyComparerでは型の種類に応じて、4種類の異なる比較処理を生成していました。

  1. string
  2. 値型かつIComparableな型
  3. IComparableまたはIComparableな型
  4. それ以外

なぜ4種類に分けて扱うのか?
stringはComparable.Default.Compareの比較が好ましくないため。MSDNライブラリ参照。
値型かつIComparableな型を別に扱うのは高速化のため。なければなくてもいい。
IComparableまたはIComparableな型はComparable.Default.Compareで比較できる。
それ以外は比較しようがないので、ToString()して比較してみる。もともとMSDNコラムの記事にあったコードのまね。データバインドでDataGridViewに表示する型を比較する処理なので、プロパティの中身は普通に考えて表示可能です。なので、この処理はなかなか有効です。ToString()してもどうしようもない型は、もうどうにもできないのであきらめ。

ここにNullableが来ると困ったことに「それ以外」に振り分けられてしまいました。変更後はIComparableまたはIComparableな型の比較処理を生成するようにしました。