如何使用 Linq 对两个 DatetimeOffset 属性进行排序

How to order two DatetimeOffset properties using Linq

我有一个名为 DocumentHistory 的 class,它有两个 DateTimeOffset? 属性 - CreatedOnModifiedOn。我希望能够在 最近一次 之前 订购 而不必指定要 属性 首先查看。

我曾尝试使用 Linq 的 OrderByDescending 对它们进行排序。

  var documentHistories = docHistory
    .OrderByDescending(c => c.CreatedOn)
    .ThenByDescending(c => c.ModifiedOn)
    .ToList();

在一般情况下,您可以尝试将所有可供选择的属性组合成一个 集合(例如,数组)并添加 Max()

var documentHistories = docHistory
  .OrderByDescending(c => new DateTimeOffset?[] {
     c.CreatedOn,  //TODO: put all the relevant properties here 
     c.ModifiedOn,
   }.Max())
  .ToList();

如果您只有 2 个属性,您可以将查询简化为

var documentHistories = docHistory
  .OrderByDescending(c => c.CreatedOn > c.ModifiedOn ? c.CreatedOn : c.ModifiedOn)
  .ToList();

您可以尝试在您的 DocumentHistory class 上实现 IComparable。例如,你可以有这样的东西:

class DocumentHistory : IComparable<DocumentHistory>
{
    public DateTime? CreatedOn { get; set; }
    public DateTime? ModifiedOn { get; set; }

    public int CompareTo(DocumentHistory other)
    {
        if (ReferenceEquals(this, other)) return 0;
        if (ReferenceEquals(null, other)) return 1;

        var thisMostRecentDate = Nullable.Compare(CreatedOn, ModifiedOn) > 0 ? CreatedOn : ModifiedOn;
        var otherMostRecentDate = Nullable.Compare(other.CreatedOn, other.ModifiedOn) > 0 ? other.CreatedOn : other.ModifiedOn;

        return Nullable.Compare(otherMostRecentDate, thisMostRecentDate);
    }
}

然后,如果您只是在您的列表上调用 Sort(),它会按照您期望的顺序对它们进行排序。