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 方法。
相关推荐
JaydenAI1 小时前
[MAF预定义ChatClient中间件-06]利用ImageGeneratingChatClient开发专业图片生成Agent
ai·c#·agent·agent管道·chatclient中间件·chatclient管道
csdn_aspnet3 小时前
Modbus TCP C# 客户端程序
服务器·网络·tcp/ip·c#
0x00073 小时前
译 Anders Hejlsberg 谈 C# 与 .NET
开发语言·c#·.net
Xin_ye100864 小时前
C# 零基础到精通教程 - 第十七章:前端集成——Blazor 基础
开发语言·c#
daopuyun4 小时前
《C#语言源代码漏洞测试规范》解读,如何依据GB/T 34946-2017标准建立代码测试技术体系
c#·代码测试·源代码安全检测
魔法阵维护师5 小时前
从零开发游戏需要学习的c#模块,第三十一章(技能冷却系统 —— 范围爆炸)
学习·游戏·c#
吴可可1235 小时前
ModelSpace常量正确用法解析
c#
影寂ldy6 小时前
C#List泛型集合
windows·c#·list
狂人开飞机6 小时前
01. 工厂模式(Factory Pattern)
设计模式·c#