c# - 长类型的 Lambda 排序
问题描述
我正在尝试运行如下排序,但遇到Start
了 Lambda 表达式中属性为 Long 类型的问题。当它们是 int 类型时,它可以正常工作,但我需要它来处理更大的值。我尝试将转换a.Start - b.Start
为 int 但这似乎提供了不正确的排序结果。
是否应该使用不同的方法进行排序或更改数据类型?
ranges.Sort((a, b) => a.Start - b.Start);
private readonly List<Range> ranges = new List<Range>();
public class Range
{
public Range(long startEnd) : this(startEnd, startEnd)
{
}
public Range(long start, long end)
{
if (end >= start)
{
Start = start;
End = end;
}
else
{
Start = end;
End = start;
}
}
public long Start { get; private set; }
public long End { get; private set; }
public void Update(long newStart, long newEnd)
{
Start = newStart;
End = newEnd;
}
public static implicit operator Range(long i)
{
return new Range(i);
}
}
解决方案
您传递给的函数Sort
应该:
- 如果 a < b 则返回任何负数(例如,可以始终为 -1)
- 如果 a == b 则为零
- 如果 a > b 则为正数(例如,可以始终为 1)
您当前的函数满足此条件(但由于潜在的溢出,使用不安全),但返回long
. 但是,还有许多其他功能可以满足此标准。一个是已经存在的长期比较器:
ranges.Sort((a, b) => a.Start.CompareTo(b.Start));
如果您愿意,您可以自己做同样的事情(尽管没有理由):
ranges.Sort((a, b) => a.Start > b.Start ? 1 : a.Start < b.Start ? -1 : 0);
推荐阅读
- html - 如何编写一系列 Excel 单元格并将其另存为单独的 HTML 文件
- ios - UISearchController 改变颜色
- configuration - 用于创建配置文件的问卷调查工具
- r - 将稀疏邻接列表转换为 R 中的完整矩阵
- python - 如何找出另一个键:值对是否存在于 Python 的字典中?
- python-3.x - 将列表放入 csv 并将 csv 放入列表
- sql-server - SQL Server - Try-Catch / xact_abort off 和 xact_state
- react-router - Mobx 6 observable 无法与 mobx-router5 一起正常工作
- css - 响应式图像网格会导致小数像素,这会使图像无法容纳在一行中
- javascript - 当分数变为 200 时结束 p5js 游戏