SortableBindingList その2

id:siokoshou:20070225 をもうちょっと改良してみるの巻。
CodeZineで同じネタがVB化されてました
元ネタはこちら。http://www.microsoft.com/japan/msdn/columns/winforms/winforms02182005.aspx
CodeZineの記事は明らかに元ネタを参考にしているのに参考資料にあげてないのは、元ネタのコードがそのままじゃ動かないから?それより、EULAに抵触するような気がしないでもないけど、動かないコードを載せたまま更新してないMSDNのほうがどうかと思うので、まあいいや。

この SortableBindingList、実はかなりお気に入り。SortableBindingList.DataSource に List BindingSource.DataSource に SortableBindingList( list ) を入れるだけでソートできるってのはホントに便利。リフレクションを使うから遅いんだけど、どうせ DataGridView の表示はその何百倍(?)も遅いので、まあいいかなと。

で、ふと、このコードの肝の PropertyComparer ってのは、SortBy のコアじゃないか!と気づいたわけです。List<エンティティクラス> list を、あるプロパティの順でソートしたいとき list.SortBy( プロパティ名 ); みたいに書ければ便利ですよね。C#3.0の拡張メソッドでこう書ける日がそのうち来るんだけど、でもまあ list.Sort( new PropertyComparer( property, direction ) ); でもいいかな。3段落続けて妥協ばかりw

プロパティ名のところは stringだと楽だけど、型安全にこだわる.NET的には PropertyComparer のように PropertyDescriptor か、PropertyInfo あたりかな。まあ、候補はこの3つ。

元ネタでは PropertyComparerhttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnadvnet/html/vbnet01272004.asp からのコピペってコメントがあるんだけど404。ぐぐってみると、あちこちに似たようなコードがありました。
トップに出てきた CodeProject のコードはなかなかよさげ。これは string でプロパティ名を指定してますね。
http://www.codeproject.com/useritems/PropertyComparer.asp


長い前振りはここまでにして、SortBy として使うとなるとやっぱり遅さが気になるんで、高速化にチャレンジしてみました。コードが気に入らないって理由もあったりしますが書いた人には内緒にしといてください。最初に断っておくと、まだ途中です。2倍弱速くなったけど、それだけ(^^;

Compare が呼ばれるたびにリフレクションで値を取り出すので、きっとここが遅いと。メモ化がおそらく効果的で、あとはリフレクションを使わないようにできないかなぁと妄想。できるのかどうか知らないけど、ジェネリクスとリフレクションのあたりはおもしろそうなので、いろいろ調べつつ挑戦。

前回載せなかった SortableBindingList も書いてしまいます。CodeZineが載せたんだからいいかな、なんて。

続きを読む