コンパイラって
偉大だな、とか思ったりw
FastPropertyComparerでNullableも特別なサポートが必要だってわかった。メンドー。
普段使ってるのはNullableジェネリック構造体。比較はNullableクラスにあるCompare。
public struct Nullablewhere T : struct public static class Nullable
この2つがある。…知らなかった。FastPropertyComparerで特別サポートが必要なのは作りのせいです。念のため。
LINQの OrderBy もあるし、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種類の異なる比較処理を生成していました。
- string
- 値型かつIComparable
な型 - IComparable
またはIComparableな型 - それ以外
なぜ4種類に分けて扱うのか?
stringはComparable
値型かつIComparable
IComparable
それ以外は比較しようがないので、ToString()して比較してみる。もともとMSDNコラムの記事にあったコードのまね。データバインドでDataGridViewに表示する型を比較する処理なので、プロパティの中身は普通に考えて表示可能です。なので、この処理はなかなか有効です。ToString()してもどうしようもない型は、もうどうにもできないのであきらめ。
ここにNullableが来ると困ったことに「それ以外」に振り分けられてしまいました。変更後はIComparable