返回两个数字中最大的一个最简单的方法是什么?

时间:2010-11-30 20:22:45

标签: c# linq collections comparison max

假设我有一个看起来像这样的实体:

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(),你会得到一个例外,所以你必须先检查集合中是否有任何东西。

9 个答案:

答案 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);
    }
}