如何使用 Linq 对两个 DatetimeOffset 属性进行排序
How to order two DatetimeOffset properties using Linq
我有一个名为 DocumentHistory 的 class,它有两个 DateTimeOffset?
属性 - CreatedOn
和 ModifiedOn
。我希望能够在 最近一次 之前 订购 而不必指定要 属性 首先查看。
我曾尝试使用 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()
,它会按照您期望的顺序对它们进行排序。
我有一个名为 DocumentHistory 的 class,它有两个 DateTimeOffset?
属性 - CreatedOn
和 ModifiedOn
。我希望能够在 最近一次 之前 订购 而不必指定要 属性 首先查看。
我曾尝试使用 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()
,它会按照您期望的顺序对它们进行排序。