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 方法。
相关推荐
WYH2878 小时前
C#控制台输入(Read()、ReadKey()和ReadLine())
开发语言·c#
hqwest9 小时前
C#WPF实战出真汁06--【系统设置】--餐桌类型设置
c#·.net·wpf·布局·分页·命令·viewmodel
做一位快乐的码农12 小时前
基于.net、C#、asp.net、vs的保护大自然网站的设计与实现
c#·asp.net·.net
DavieLau12 小时前
C#项目WCF接口暴露调用及SOAP接口请求测试(Python版)
xml·服务器·开发语言·python·c#
张人玉13 小时前
C#Encoding
开发语言·c#
hqwest15 小时前
C#WPF实战出真汁05--左侧导航
开发语言·c#·wpf·主界面·窗体设计·视图viewmodel
小码编匠17 小时前
C# Bitmap 类在工控实时图像处理中的高效应用与避坑
后端·c#·.net
Kyln.Wu20 小时前
【python实用小脚本-187】Python一键批量改PDF文字:拖进来秒出新文件——再也不用Acrobat来回导
python·pdf·c#
hqwest21 小时前
C#WPF实战出真汁01--项目介绍
开发语言·c#·wpf
小牛壮士21 小时前
Tokenizer(切词器)的不同实现算法
开发语言·算法·c#