2016-12-18 10 views
1

この構文では、使用するデリゲートのロジックがわかりません。私は無名関数として知られているデリゲートが、あなたは以下のように完全に独立した機能を必要とせずに比較メカニズムを宣言することができますc#並べ替え内のこのデリゲートは何ですか

Array.Sort (thing, delegate (Things c1, Things c2) 
      { 
       return c1.Item.CompareTo(c2.Item); 
      }); 
+1

これは、匿名関数と呼ばれています。 – SLaks

+0

これが役立つことがあります。http://stackoverflow.com/questions/2122012/c-sorting-with-anonymous-function – seems

答えて

1

...文字列を並べ替えると、この出くわしする方法を探しています:

private void button1_Click(object sender, EventArgs e) 
    { 
     Things t1 = new Things(); 
     t1.Item = "z"; 
     Things t2 = new Things(); 
     t2.Item = "a"; 

     Things[] things = new Things[]{ t1, t2}; 
     Array.Sort(things, CompareThings); 

     foreach(Things t in things) 
     { 
      Console.WriteLine(t.Item); 
     } 
    } 

    private int CompareThings(Things c1, Things c2) 
    { 
     return c1.Item.CompareTo(c2.Item); 
    } 

​​は、ソートの2つのバージョンを示し、1つは匿名関数を持ち、もう1つは宣言された関数を持ちます(前述)。

注釈として、とc2.Itemを明示的に比較する必要があります.Netは、1つの "Things"インスタンスを別のものと比較する方法がわからないためです。

public class Things : IComparable<Things> 
{ 
    public string Item = ""; 

    int IComparable<Things>.CompareTo(Things other) 
    { 
     return this.Item.CompareTo(other.Item); 
    } 

} 

が続く:に属し、特定のクラスのために

private void button1_Click(object sender, EventArgs e) 
    { 
     Things t1 = new Things(); 
     t1.Item = "z"; 
     Things t2 = new Things(); 
     t2.Item = "a"; 

     Things[] things = new Things[]{ t1, t2}; 
     Array.Sort(things); // <-- the intenal implementation of CompareTo() we added to class Things will be used! 

     foreach(Things t in things) 
     { 
      Console.WriteLine(t.Item); 
     } 
    } 
1

あなたがIComparableインターフェイスを実装する場合は、しかし、その後、あなたのコードは、あなたが匿名または別の機能を必要としないようきれいになりインタフェースIComparableをは(参照ので、.NETフレームワークは、ストリングクラスと番号を表すクラス(整数、浮動小数、...)のように、デリゲートが任意ある@Idle_Mind ANS wer)は既に実装されています。

あなたがにしたい場合は、このデリゲートを定義することができます特殊な動作か、IComparableをを実装していない非編集可能なクラスに比較メカニズムを使用する場合を実装します。

あなたは通常の文字列をソートする必要があり考慮:

Array.Sort(sa, (x, y) => x.CompareTo(y) * -1); 

理由:

string s = "eabdfc"; //String to sort 
char[] sa = s.ToCharArray(); //Convert to array 
Array.Sort(sa); //Sort without any delegate 
Console.WriteLine(new string(sa)); // The new string sorted 

は、あなたが他の方向に文字列をソートする必要があり考慮すると、あなたはでのArray.sortラインを置き換えることができます? CompareToを返す必要があるため:

  • -1 < X 素子場合Y
  • 0素子X = Y
  • 1かの要素X> Y

もしそうであれば、任意のクラスでArray.Sortを使用する場合は、次のいずれかを行う必要があります。IComparableインターフェイス(もしあればser定義クラス)、またはデリゲートを定義します。

要約:IComparableがクラスの既定の動作を提供するのに対し、同じクラスまたは同じオブジェクトの異なる場所で異なる動作を記述できるため、デリゲートの柔軟性が向上します。

私の英語は分かりやすいと思いますが、私を修正してください。

関連する問題