[英]c# What is this delegate within a sort
我不理解這種語法中使用委托的邏輯。 我正在尋找對字符串進行排序並遇到這種情況的方法...
Array.Sort (thing, delegate (Things c1, Things c2)
{
return c1.Item.CompareTo(c2.Item);
});
對於某些屬於.NET Framework的類,例如String類和代表數字的類(int,float,decimal,...),委托是可選的,因為接口IComparable (請參閱@Idle_Mind答案)實現。
如果要實現特殊行為,或者要在未實現IComparable的不可編輯類上使用比較機制,則可以定義此委托。
考慮到您必須正常地對字符串進行排序:
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行替換為:
Array.Sort(sa, (x, y) => x.CompareTo(y) * -1);
為什么呢 因為CompareTo必須返回:
因此,如果要對任何類使用Array.Sort,則必須:實現IComparable接口(如果它是用戶定義的類),或者定義委托。
總結:委托提供了更大的靈活性,因為我們可以在同一地方為同一類或同一對象編寫不同的行為,而IComparable為一個類提供默認行為。
我希望我的英語是可以理解的,請隨時糾正我。
委托(稱為匿名函數)使您可以聲明比較機制,而無需完全獨立的函數,如下所示:
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);
}
這是MSDN上的示例,其中顯示了一個排序的兩個版本,一個具有匿名函數,一個具有聲明的函數(如上所述)。
附帶說明一下, c1.Item
將c2.Item
與c1.Item
進行顯式比較,因為.Net不知道如何將一個“ Things”實例與另一個“ 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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.