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

时间:2019-05-08 10:59:54

标签: c# datetimeoffset

我有一个名为DocumentHistory的类,它具有两个DateTimeOffset?CreatedOn属性。我希望能够最近一次 订购,而不必指定想要先查看的属性。

我尝试使用Linq的ModifiedOn来订购它们。

OrderByDescending

2 个答案:

答案 0 :(得分:2)

您可以尝试在DocumentHistory类上实现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(),它将按照您期望的顺序对它们进行排序。

答案 1 :(得分:0)

通常情况下,您可以尝试将所有属性组合成一个集合(例如数组),然后添加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();