今天刷leetcode遇到一道题,让我感觉我对Icomparer的理解非常不足,题目如下:
我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。
(这里,平面上两点之间的距离是欧几里德距离。)
你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。
示例 1:
输入:points = [[1,3],[-2,2]], K = 1
输出:[[-2,2]]
解释:
(1, 3) 和原点之间的距离为 sqrt(10),
(-2, 2) 和原点之间的距离为 sqrt(8),
由于 sqrt(8) < sqrt(10),(-2, 2) 离原点更近。
我们只需要距离原点最近的 K = 1 个点,所以答案就是 [[-2,2]]。
示例 2:
输入:points = [[3,3],[5,-1],[-2,4]], K = 2
输出:[[3,3],[-2,4]]
(答案 [[-2,4],[3,3]] 也会被接受。)
根据官方解法,我写出了C#版本的答案:如下
public class Solution { public int[][] KClosest(int[][] points, int K) { //int[] res=new int[points[0].Length]; //Dictionary<int,int[][]> dict=new Dictionary<int,int[][]>(); Array.Sort(points, new newCom()); int[][] res = new int[K][]; Array.Copy(points, res, K); return res; } } public class newCom : IComparer<int[]> { int IComparer<int[]>.Compare(int[] point1, int[] point2) { return (point1[0] * point1[0] + point1[1] * point1[1]) - (point2[0] * point2[0] + point2[1] * point2[1]); } }
这道题并不难,但是考察了Sort方法和Icomparer的用法,这里我查了下资料一共有Icomparer,ComParer,IComparable三个东东。
总结:
IComparable<>要在要比较的对象类中实现接口CompareTo;
IComparer<>要在一个单独的类中实现,可以比较任意两个对象;
因此如果你使用的这个类的某些东西被封装后,可以使用IComparer来实现,但是如果没有被封装,可以使当前类实现IComparable的CompareTo方法来达到比较的目的。
对于Comparer类借鉴了这位大佬的看法:
原文地址:https://blog.csdn.net/lidandan2016/article/details/78480237
.net framework 在类 Comparer 上提供了IComparer 接口的默认实现方式,类 Comparer 位于system.collections 名称空间中,可以对简单类型以及支持IComparable
接口的任意类型进行特定文化的比较。例如,可以通过下面的代码使用它:
代码如下:
string firststring = "First String"; string secondstring = "Second string"; Comparer.Default.Compare(firststring , secondstring); int firstNumber = 35; int secondNumber = 23; Comparer.Default.Compare(firstNumber , secondNumber);
这里使用Comparer.Default静态成员获取Comparer类的一个实例,接着使用 Compare()方法来比较。
在使用 Comparer时,必须使用可以比较的类型。例如,试图比较firstString 和 firstNumber 就会生成一个异常。
下面是这个类的一些注意事项:
.net框架包含两个类,实现了IComparer接口,Comparer和CaseInsensitiveComparer类提供了IComparer的基本实现方式。
1)不要使用new运算符直接创建Comparer类的实例,应调用Default方法,该方法将返回一个已被适当地初始化过的Comparer对象,如下:
ComparertheComparer=Comparer.Default;
拥有Comparer对象以后,可以将比较类委托给调用它的Compare方法,如下:
publicint Compare(object x,object y)
{
returnComparer.Default.Compare(x,y);
}
2)CaseInsensitiveComparer类的行为与Comparer类非常相似,都是通过ICompareble接口比较任意两个对象,区别是前者对遇到的字符串不区分大小写的比较。与Comparer类似,初始化过的CaseInsensitiveComparer对象可以使用静态Default方法来获取索引,如下:
CaseInsensitiveCompareraComparer=CaseInsensitiveComparer.Default;