Какой самый простой способ вернуть большее из двух чисел? - PullRequest
3 голосов
/ 30 ноября 2010

Допустим, у меня есть сущность, которая выглядит следующим образом:

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 ]

7 голосов
/ 30 ноября 2010

Просто сохраните max в переменной, а не выполняйте вычисление дважды.

public DateTime LastActivity
{
    get 
    { 
        var max = Pictures.Max(x => x.LastUpdated);
        return max > this.LastUpdated
          ? max
          : this.LastUpdated 
    };
}
2 голосов
/ 30 ноября 2010

Просто назначьте максимум дат изображения локальной переменной, а затем выполните сравнение, которое вы уже написали.

1 голос
/ 30 ноября 2010
public DateTime LastActivity
{         
    get { return Pictures.Select(x => x.LastUpdated).Concat(new DateTime[] { this.LastUpdated }).Max();
}
1 голос
/ 30 ноября 2010

Как насчет этого?

public DateTime LastActivity 
{ 
    get 
    {
         DateTime lastPicture = Pictures.Max(x => x.LastUpdated);
         return lastPicture > this.LastUpdated ? lastPicture : this.LastUpdated;
     }
} 
1 голос
/ 30 ноября 2010
public DateTime LastActivity
{
    get
    {
        var picturesMax = Pictures.Max(x => x.LastUpdated);
        return picturesMax > this.LastUpdated
          ? picturesMax
          : this.LastUpdated)
    };
}
0 голосов
/ 01 декабря 2010

Это довольно просто и должно занять пустую коллекцию Pictures:

public DateTime LastActivity
{
    get
    {
        return Pictures.Aggregate(LastUpdated,
                            (a, x) => x.LastUpdated > a ? x.LastUpdated : a);
    }
}
0 голосов
/ 30 ноября 2010

Чтобы сохранить его LINQy ...

public DateTime LastActivity
{
    get 
    { 
         return Pictures.Any(x => x.LastUpdated > this.LastUpdated) 
                ? Pictures.Max(x => x.LastUpdated) 
                : this.LastUpdated; 
    }
}

Обновление (обновления): добавлено значение по умолчанию LastUpdated, возвращаемое, если выражение LINQ не возвращает результатов, и исправлено замечание OP.

0 голосов
/ 30 ноября 2010

Просто сохраните максимальное значение во временном:

public DateTime LastActivity
{
    get {
        DateTime maxLastUpdated = Pictures.Max(x => x.LastUpdated);
        return maxLastUpdated > this.LastUpdated
            ? maxLastUpdated
            : this.LastUpdated) };
}
0 голосов
/ 30 ноября 2010

Я использую следующее в библиотеке фреймворков ...

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);

...