List<T>.Sort()方法有3个重载。
其中之一如下所示
System.Collections.Generic.List<T>.Sort(System.Comparison<T>)在看到Comparison<T>时,我认为它应该是一个从Comparison<T>类派生的类。(对参数的通常解释)
但是下面的代码运行得很好,据说是使用了上面的重载。
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());
}我确实给了一个静态方法一个委托来代替Comparison<T>。它怎麽工作?
发布于 2010-08-17 10:32:07
System.Comparison的定义如下:
public delegate int Comparison<in T>(T x, T y);这意味着它是delegate,而不是一个类。接受委托作为参数的方法实际上接受的是方法,而不是比较类的实例。
这段代码可以用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());
}
}发布于 2010-08-17 10:30:21
System.Comparison是一个代表。
public delegate int Comparison<in T>(
T x,
T y
)您的CompareWithCase方法的签名使其完全可以赋值给Comparison<int>。
请注意,如果没有类型推断,您的Sort调用必须编写为:
collection.Sort(new Comparison<int>(MyComparer.CompareWithCase));仅供参考,List<T>.Sort的另外两个重载期望IComparer<T>实现
https://stackoverflow.com/questions/3498891
复制相似问题