我正在尝试按以下方式运行排序,但遇到了一个问题,即 Lambda 表达式中的 Start
属性属于 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);
关于c# - 长类型的 Lambda 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50039472/