list1.Sort((m, n) => m.Id - n.Id); id是double类型的为什么回报错

问题产生的地方

原因

对于 double 类型的属性,不能直接使用减法运算符进行比较。减法运算符只能用于数值类型,而 double 是浮点数类型。

要在 double 属性上进行排序,可以使用 CompareTo 方法或者使用自定义的比较器。

更改

要在 double 属性上进行排序,可以使用 CompareTo 方法或者使用自定义的比较器。下面是两种可行的方式:

1.使用 CompareTo 方法:

cs 复制代码
list1.Sort((m, n) => m.Id.CompareTo(n.Id));

使用了 CompareTo 方法来比较两个 double 值的大小

2.使用自定义的比较器:

cs 复制代码
public 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 方法的参数是一个委托,用于比较两个元素的大小关系,以实现排序功能。这个委托类型的声明如下:

cs 复制代码
public 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 方法的类:

  1. Int32, Int64, Double, Decimal 等数值类型:这些数值类型都实现了 IComparable 接口,并且提供了 CompareTo 方法来比较它们之间的大小关系。
  2. String 类型:String 类型实现了 IComparable 接口,因此它也具有 CompareTo 方法,用于按照字典顺序比较字符串的大小。
  3. DateTime 类型:DateTime 类型也实现了 IComparable 接口,并提供了 CompareTo 方法,用于比较日期和时间。
  4. 用户自定义类:如果你在自己的类中实现了 IComparable 接口,并提供了 CompareTo 方法的实现,那么你的类也会具有 CompareTo 方法。
相关推荐
△曉風殘月〆5 小时前
WPF MVVM入门系列教程(二、依赖属性)
c#·wpf·mvvm
逐·風6 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
m0_656974749 小时前
C#中的集合类及其使用
开发语言·c#
九鼎科技-Leo10 小时前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
九鼎科技-Leo12 小时前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发12 小时前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf
小乖兽技术12 小时前
C#与C++交互开发系列(二十):跨进程通信之共享内存(Shared Memory)
c++·c#·交互·ipc
幼儿园园霸柒柒13 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
平凡シンプル15 小时前
C# EF 使用
c#
丁德双15 小时前
winform 加载 office excel 插入QRCode图片如何设定位置
c#·excel