У меня есть класс DocumentHistory, у которого есть два свойства DateTimeOffset? - CreatedOn и ModifiedOn. Я хочу иметь возможность упорядочивать по самому последнему времени без необходимости указывать свойство want для просмотра в первую очередь.

Я попытался заказать их, используя OrderByDescending Линка.

  var documentHistories = docHistory
    .OrderByDescending(c => c.CreatedOn)
    .ThenByDescending(c => c.ModifiedOn)
    .ToList();
1
user10609979 8 Май 2019 в 13:59

2 ответа

Лучший ответ

Вы можете попробовать реализовать IComparable в своем классе DocumentHistory. Например, вы можете получить что-то вроде этого:

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() в своем списке, он отсортирует их в ожидаемом порядке.

2
Adam Greenall 8 Май 2019 в 11:49

В общем случае вы можете попробовать объединить все свойства на выбор в коллекцию (скажем, массив) и добавить 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();
1
Dmitry Bychenko 8 Май 2019 в 11:45