c# - 长类型的 Lambda 排序

标签 c# .net linq sorting

我正在尝试按以下方式运行排序,但遇到了一个问题,即 Lambda 表达式中的 Start 属性属于 Long 类型。当它们是 int 类型时,它工作正常,但我需要它来处理更大的值。我试过将 a.Start - b.Start 转换为 int 但这似乎提供了不正确的排序结果。

是否应该使用不同的方法进行排序或更改数据类型?

ranges.Sort((a, b) => a.Start - b.Start);

enter image description here

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/

相关文章:

c# - 通过方法返回 list<t> 的最佳方式是什么?

java - 我们如何保存文件作为临时基础

c# - 如何在 LINQ 语句中将 int 转换为 double

c# - FluentNHibernate 查询多对多关系对象

c# - IEnumerable<string> 到字典<char, IEnumerable<string>>

c# - CosmosDb 使用 insertMany 请求率很大

c# - 控件如何处理该控件外的鼠标单击?

c# - 关于.Net继承的问题

c# - SingleOrDefault,default怎么写出来?

c# - .OrderBy()/.OrderByDescending() 与 .FirstOrDefault()/.First()