首页 > 解决方案 > 长类型的 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);
    }
}

标签: c#.netlinqsorting

解决方案


您传递给的函数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);

推荐阅读