假设我有一个看起来像这样的实体:
public class Album()
{
public DateTime LastUpdated { get; set; }
public List<Picture> Pictures { get; set; }
}
我想要做的是创建一个LastActivity
属性,该属性将返回活动的最新日期。这对于Pictures
集合来说非常简单:
public DateTime LastActivity
{
get { return Pictures.Max(x => x.LastUpdated); }
}
但是,我也想考虑LastUpdated
实体上的Album
属性。我可以使用这段代码:
public DateTime LastActivity
{
get { return Pictures.Max(x => x.LastUpdated) > this.LastUpdated
? Pictures.Max(x => x.LastUpdated)
: this.LastUpdated) };
}
但这很糟糕,因为它会进行两次Max()
转换。有没有更好的方法来编写这段代码?
这是我提出的解决方案,基于接受的答案:
public virtual DateTime LastActivity
{
get
{
var max = Pictures.Any() ? Pictures.Max(x => x.LastUpdated) : DateTime.MinValue;
return max > this.LastUpdated ? max : this.LastUpdated;
}
}
需要注意的是,如果你在空集合上做Max()
,你会得到一个例外,所以你必须先检查集合中是否有任何东西。
答案 0 :(得分:7)
只需将max存储在变量中,而不是执行两次计算。
public DateTime LastActivity
{
get
{
var max = Pictures.Max(x => x.LastUpdated);
return max > this.LastUpdated
? max
: this.LastUpdated
};
}
答案 1 :(得分:2)
只需将图片日期最大值分配给局部变量,然后进行已编写的比较。
答案 2 :(得分:1)
public DateTime LastActivity
{
get
{
var picturesMax = Pictures.Max(x => x.LastUpdated);
return picturesMax > this.LastUpdated
? picturesMax
: this.LastUpdated)
};
}
答案 3 :(得分:1)
这个怎么样?
public DateTime LastActivity
{
get
{
DateTime lastPicture = Pictures.Max(x => x.LastUpdated);
return lastPicture > this.LastUpdated ? lastPicture : this.LastUpdated;
}
}
答案 4 :(得分:1)
public DateTime LastActivity
{
get { return Pictures.Select(x => x.LastUpdated).Concat(new DateTime[] { this.LastUpdated }).Max();
}
答案 5 :(得分:0)
我在框架库中使用以下内容......
public static T Maximum<T>(params T[] values)
where T : struct, IComparable<T>
{
var rV = values[0];
foreach (var v in values.Where
(v => v.CompareTo(rV) > 0))
rV = v;
return rV;
}
在客户端代码中我可以简单地写
var maxVal = lib.Maximum(Value1, Value2, .... , ValueN);
答案 6 :(得分:0)
只需将最大值存储在临时值中:
public DateTime LastActivity
{
get {
DateTime maxLastUpdated = Pictures.Max(x => x.LastUpdated);
return maxLastUpdated > this.LastUpdated
? maxLastUpdated
: this.LastUpdated) };
}
答案 7 :(得分:0)
保持LINQy ......
public DateTime LastActivity
{
get
{
return Pictures.Any(x => x.LastUpdated > this.LastUpdated)
? Pictures.Max(x => x.LastUpdated)
: this.LastUpdated;
}
}
更新:如果LINQ表达式没有返回结果,则添加要返回的默认LastUpdated,并针对OP的注释进行更正。
答案 8 :(得分:0)
这是相当简单的,应该采取空的Pictures
集合:
public DateTime LastActivity
{
get
{
return Pictures.Aggregate(LastUpdated,
(a, x) => x.LastUpdated > a ? x.LastUpdated : a);
}
}