【问题标题】:c# What is this delegate within a sortc# 排序中的这个委托是什么
【发布时间】:2016-12-19 18:23:42
【问题描述】:

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

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

【问题讨论】:

标签: c# filenames streamreader


【解决方案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
  • 0 如果元素 x = y
  • 1 如果元素 x > y

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

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

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

【讨论】:

    【解决方案2】:

    委托,称为匿名函数,允许您声明比较机制,而无需完全独立的函数,如下所示:

        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);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2012-03-23
      • 2010-12-18
      • 2018-01-30
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多