- ベストアンサー
C#で複数キーのソート
VS2005のC#で作成してます、C#超初心者です。 複数キーでのソートを行いたいのですが、リファレンスを見ても何がなんだか分からず・・。 WEBで同じような事が http://blogs.wankuma.com/episteme/archive/2008/08/23/154066.aspx に紹介されてました。ここを元に動作確認したいのですが、コンパイルが通りません。 class MultiKeyComp<T> : System.Collections.Generic.IComparer<T>{ private Comparison<T>[] comps; public MultiKeyComp(params Comparison<T>[] c){ comps = c; } public int Compare(T x, T y){ int result = 0; foreach (Comparison<T> c in comps){ if ((result = c(x, y)) != 0) break; } return result; } } 動作部... int N = 10; データ[] data = new データ[N]; for ( int i = 0; i < N; ++i ) { データ datum = new データ(); datum.key1 = "0000001111"; datum.key2 = "0000001112"; datum.key3 = "0000001110"; data[i] = datum; } Comparison<データ> c = new MultiKeyComp<データ>( //↓ここが分かりません・・ (x,y) => x.key1.CompareTo(y.key1), (x,y) => 0, (x,y) => y.key3.CompareTo(x.key3) ); Array.Sort(data, c); どこが悪いのでしょうか?お分かりになりましたらよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
C#2005でやるなら キーに対するCompare関数を定義してこの配列を MultiKeyCompのコンストラクタに渡してやれば良いようです private static int myComp1( データ x, データ y ) { return x.key1.CompareTo( y.key1 ); } private static int myComp2( データ x, データ y ) { // return x.key2.CompareTo( y.key2 ); return 0; } private static int myComp1( データ x, データ y ) { return y.key3.CompareTo( x.key3 ); } と定義しておいて Comparison<データ> c = new MultiKeyComp<データ>( new Comparison<データ>[] { myComp1, myComp2, myComp3 } ); といった具合にしてみましょう
その他の回答 (1)
- Gab_km
- ベストアンサー率40% (20/50)
LINQとか、式木(あとラムダ式)という言葉はご存じでしょうか? このあたりは.NETの話の中でも強力な力を持っていますが、その分難しいところでもあります。 とりあえず、参照リンク先のεπιστημηさんのソースコードを全部コピーさせていただいてビルドしたところ、ちゃんと通りました。 bobo39さんがデータをセットしている箇所以外、同じコードを持ってきているならば上手くいくはずです。 ただし、C# 3.0以降(.NET Frameworkだと3.5以降でしょうか)であることが必須条件になります。 もし同じコードを書いていてビルドできないようであれば、問題はそこにあるのではないでしょうか。
お礼
ありがとうございます。επιστημηさんの紹介されてるページのソースをそのまま貼り付けてやったのですが、上記の部分で)閉じが無いとか、>が無いとかでコンパイルエラーになっていました。 文法的にもほとんど、成型式が分からず困っていました。 επιστημηさんも併せてありがとうございました。 LINQの話題もコメントで書かれていましたが、ちんぷんかんぷんです。まず、基礎構文が分かってから段階を踏もうと思います。ありがとうございました。
お礼
ありがとうございます。確かに出来ました!ただ、ソースを見てもまだピンときません。勉強します。 本当に助かりましたー。