.net - System.Comparison<T> 理解

标签 .net

List<T>.Sort()方法有 3 个重载。

其中之一如下

System.Collections.Generic.List<T>.Sort(System.Comparison<T>)

看到Comparison<T> ,我认为它应该是一个派生自 Comparison<T> 的类类(class)。 (参数的通常解释)

但是下面的效果非常好,据说使用了上面的重载。

        public static void Main(string[] args)
        {
            List<Int32> collection = new List<Int32>();

            collection.Add(20);
            collection.Add(270);
            collection.Add(30);
            collection.Add(90);
            collection.Add(40);
            collection.Add(18);
            collection.Add(100);

            collection.Sort(MyComparer.CompareWithCase);

            foreach (Int32 s in collection)
                Console.WriteLine(s);
        }

        public static int CompareWithCase(int i1, int i2)
        {
            return i1.ToString().CompareTo(i2.ToString());
        }

我确实将委托(delegate)交给了静态方法来代替 Comparison<T> 。 它是如何工作的?

最佳答案

System.Comparison<T> 定义如下:

public delegate int Comparison<in T>(T x, T y);

这意味着它是 delegate ,不是一个类。接受委托(delegate)作为参数的方法实际上接受的是方法,而不是 Comparison 类的实例。

此代码可以使用 lambda 表达式重写如下:

collection.Sort((i1, i2) => i1.ToString().CompareTo(i2.ToString()));

以下代码片段可能会更好地解释发生的情况:

public static class TestClass {

  public static void Main(string[] args){
      Comparison<Int32> comparisonDelegate = CompareWithCase;
      //We now can use comparisonDelegate as though it is a method;
      int result = comparisonDelegate(1,2);
  }

  public static int CompareWithCase(int i1, int i2)
  {
     return i1.ToString().CompareTo(i2.ToString());
  } 
}

关于.net - System.Comparison<T> 理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3498891/

相关文章:

c# - 为什么不能将 Action<Object> 委托(delegate)用作线程池的 WaitCallback?

c# - 替换/删除代码或 SQL 中的文本

.net - 什么是背景,前景和主线程?

c# - WPF Datagrid 新行验证

c# - Entity Framework 6 - 引用表 - 如何编写自定义导航属性逻辑?

c# - 尝试应用良好的依赖注入(inject)实践时遇到的问题

.net - 在.Net中以零开头填充一个数字

c# - 编辑列表中的项目<T>

.net - .net 中最好的技术是什么?用于网络开发

c# - NoSQL数据库中的架构迁移脚本