我不理解这种语法中使用委托的逻辑。我正在寻找对字符串进行排序的方法,并且遇到了这个......
Array.Sort (thing, delegate (Things c1, Things c2)
{
return c1.Item.CompareTo(c2.Item);
});
答案 0 :(得分: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);
}
Here's an example on MSDN显示排序的两个版本,一个带有匿名函数,另一个带有声明的函数(如上所述)。
作为旁注,c1.Item
与c2.Item
的明确比较是必要的,因为.Net不知道如何将一个“事物”实例与另一个实例进行比较。但是,如果您实现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 :(得分:1)
对于属于.NET框架的某些类,如 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则为类提供默认行为。
我希望我的英语是可以理解的,随时纠正我。