2016-12-18 37 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); 
    } 

​​表示排序的兩個版本,一個與一個匿名功能,和一用一聲明的函數(如上所述)。

作爲一個附註,c1.Itemc2.Item的顯式比較是必要的,因爲.Net不知道它應該如何比較一個「Things」實例與另一個實例。如果要實現IComparable接口,但是,那麼你的代碼變得更清潔,你並不需要匿名或單獨的函數:

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

對於那些屬於一定的階級.NET框架,如字符串類和代表數字(int,float,decimal,...)的類,委託是可選,因爲接口IComparable(請參閱@Idle_Mind ans )已經實施。

如果你想實行特殊行爲您可以定義此委託或者如果你想使用的比較機制上不可編輯類不實現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 <Ý
  • 0,如果元件X = Y
  • 1,如果元件X> Y

所以,如果你想使用Array.Sort與任何類,你必須:或者實現IComparable接口(如果它是一個你ser定義的類),或定義委託。

總結:委託提供了更大的靈活性,因爲我們可以在不同的地方針對相同的類或同一對象編寫不同的行爲,而IComparable則爲類提供默認行爲。

我希望我的英語可以理解,隨時糾正我。