问题产生的地方
原因
对于
double
类型的属性,不能直接使用减法运算符进行比较。减法运算符只能用于数值类型,而double
是浮点数类型。要在
double
属性上进行排序,可以使用CompareTo
方法或者使用自定义的比较器。
更改
要在
double
属性上进行排序,可以使用CompareTo
方法或者使用自定义的比较器。下面是两种可行的方式:1.使用
CompareTo
方法:
cslist1.Sort((m, n) => m.Id.CompareTo(n.Id));
使用了
CompareTo
方法来比较两个double
值的大小2.使用自定义的比较器:
cspublic class DoubleComparer : IComparer<double> { public int Compare(double x, double y) { return x.CompareTo(y); } } // 在排序时使用自定义的比较器 list1.Sort((m, n) => new DoubleComparer().Compare(m.Id, n.Id));
这种写法定义了一个名为
DoubleComparer
的自定义比较器类,实现了IComparer<double>
接口的Compare
方法。然后,在排序时使用新建的DoubleComparer
实例来进行比较。
产生原因
如:list1.Sort((m, n) => m.Id - n.Id);id为double类型,为什么会报错无法将都变了隐式转换为int,为什么会报错无妨将lambda表达式转换成预期委托类型
List<T>
的Sort
方法的参数是一个委托,用于比较两个元素的大小关系,以实现排序功能。这个委托类型的声明如下:
cspublic delegate int Comparison<in T>(T x, T y);
可以将 lambda 表达式中的
m.Id - n.Id
修改为一个返回整数类型的表达式,比如(int)(m.Id - n.Id)
。这样就可以将lambda
表达式转换成预期的委托类型,从而成功地实现按照Id
属性进行排序的功能。
list.Sort((m, n) => m.PositionX - n.PositionX);m.PositionX - n.PositionX的结果是一个double 需要强转成int ,但是强转的时候会造成精度丢失 如本来是0.3 会变成0导致认为mn是相等的所以保险起见还是用
list.Sort((m, n) => m.PositionX.CompareTo(n.PositionX));
CompareTo方法
CompareTo()
方法是用于比较两个值的大小,并返回一个整数作为比较结果的表示。
CompareTo()
方法的返回值为整数,其含义如下:
- 如果
x
小于y
,则返回一个负数(通常为 -1)。- 如果
x
等于y
,则返回零。- 如果
x
大于y
,则返回一个正数(通常为 1)。返回一个整数的好处是可以更灵活地处理比较结果。通过比较结果的正负号,可以判断出两个值的相对大小关系,并进行相应的逻辑处理。
CompareTo
方法是IComparable
接口的一部分,它定义了一个用于比较对象的方法。因此,只要类实现了IComparable
接口,就会拥有CompareTo
方法。以下是一些常见的具有
CompareTo
方法的类:
Int32
,Int64
,Double
,Decimal
等数值类型:这些数值类型都实现了IComparable
接口,并且提供了CompareTo
方法来比较它们之间的大小关系。String
类型:String
类型实现了IComparable
接口,因此它也具有CompareTo
方法,用于按照字典顺序比较字符串的大小。DateTime
类型:DateTime
类型也实现了IComparable
接口,并提供了CompareTo
方法,用于比较日期和时间。- 用户自定义类:如果你在自己的类中实现了
IComparable
接口,并提供了CompareTo
方法的实现,那么你的类也会具有CompareTo
方法。