c#排序中的这个委托是什么

时间:2016-12-18 16:00:11

标签: c# filenames streamreader

我不理解这种语法中使用委托的逻辑。我正在寻找对字符串进行排序的方法,并且遇到了这个......

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

2 个答案:

答案 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.Itemc2.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必须返回:

  • -1如果元素 x&lt; ÿ
  • 如果元素 x = y ,则
  • 0
  • 1如果元素 x&gt; ÿ

因此,如果您想将Array.Sort与您必须使用的任何类一起使用:要么实现 IComparable 接口(如果它是用户定义的类),要么定义委托。

总结:委托提供了更大的灵活性,因为我们可以在同一个类或同一个对象的不同位置编写不同的行为,而IComparable则为类提供默认行为。

我希望我的英语是可以理解的,随时纠正我。