続 FastPropertyComparer

id:siokoshou:20070505 の FastPropertyComparer ですが、いろいろ問題があるんでもっとまともなのをそのうち出します。
気づいている問題点

  • IComparable または IComparable じゃない T型だと例外発生 → ToString() して比較する処理を復活させた
  • string の比較が遅い → string の比較には StringComparer がお勧めとMSDNライブラリにも書いてある
  • Tが値型だと例外発生(そういう使い方はあまり意味がないけど・・・) → NyaRuRuさんにおそわった Constrained の出番
  • Compare の引数の null チェック漏れ → 追加する ← 今ここ
  • (小さな問題) U がintのときに2倍程度遅い → 悔しいので改善する

Expression Tree で挑戦したかったはずなのに、小さいコードだし、コンテキストに応じて変わる部分もごく少ないのでそのままILでいろいろ書いてしまった。あと、昨日追加で訂正した10倍遅いってのがまた計り間違いで(--;、string.CompareOrdinal と Comparer.Default.Compare を比べてしまってた。よって、10倍も開きはありませんでした。
ちなみに DataGridView から SortableBindingList 経由でソートする場合、手元の約8500件のデータで string をソートすると、MSDNコラムのリフレクション版で500msとかそれ以上とか掛かります。 FastPropertyComparer (リフレクション+IL)で5msとかそのくらい。でも、DataGridView で表示が更新されるまでに10秒くらい掛かりますw DataGridView が遅(ry DataGridView で使うぶんにはMSDNコラム版で全然OKです。