• ベストアンサー

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); どこが悪いのでしょうか?お分かりになりましたらよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.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 } ); といった具合にしてみましょう

bobo39
質問者

お礼

ありがとうございます。確かに出来ました!ただ、ソースを見てもまだピンときません。勉強します。 本当に助かりましたー。

その他の回答 (1)

  • Gab_km
  • ベストアンサー率40% (20/50)
回答No.1

LINQとか、式木(あとラムダ式)という言葉はご存じでしょうか? このあたりは.NETの話の中でも強力な力を持っていますが、その分難しいところでもあります。 とりあえず、参照リンク先のεπιστημηさんのソースコードを全部コピーさせていただいてビルドしたところ、ちゃんと通りました。 bobo39さんがデータをセットしている箇所以外、同じコードを持ってきているならば上手くいくはずです。 ただし、C# 3.0以降(.NET Frameworkだと3.5以降でしょうか)であることが必須条件になります。 もし同じコードを書いていてビルドできないようであれば、問題はそこにあるのではないでしょうか。

bobo39
質問者

お礼

ありがとうございます。επιστημηさんの紹介されてるページのソースをそのまま貼り付けてやったのですが、上記の部分で)閉じが無いとか、>が無いとかでコンパイルエラーになっていました。 文法的にもほとんど、成型式が分からず困っていました。 επιστημηさんも併せてありがとうございました。 LINQの話題もコメントで書かれていましたが、ちんぷんかんぷんです。まず、基礎構文が分かってから段階を踏もうと思います。ありがとうございました。

関連するQ&A