繁体   English   中英

C#在某种程度上是这个委托

[英]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必须返回:

  • 如果元素x <y则为-1
  • 如果元素x = y,则为0
  • 如果元素x> y为1

因此,如果要对任何类使用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.Itemc2.Itemc1.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM