LINQ "MaxOrDefault"?

Я новичок в LINQ. Мне нужно вычислить new_id следующим образом:

public class C_Movement
{
  public int id=-1;
  public static ObservableCollection<C_Movement> list=new ObservableCollection<C_Movement>();
  // ...
}

int new_id = (C_Movement.list.Count==0) ? 0 : C_Movement.list.Max(x => x.id)+1;

Есть ли способ LINQ для сжатия этого выражения, чтобы мне не приходилось использовать ? : ? : структура? Проблема состоит в том, что, когда C_Movement.list содержит элементов, C_Movement.list.Max(x => x.id) возвращает C_Movement.list.Max(x => x.id) (и я хотел бы, чтобы он возвратил -1 вместо этого).

Спасибо.

Ответы

Ответ 1

Метод DefaultIfEmpty должен помочь:

int new_id = C_Movement.list.Select(x => x.id).DefaultIfEmpty(-1).Max()+1;

Ответ 2

Как насчет:

int new_id = 0;

if (C_Movement.list.Any())
    new_id = C_Movement.list.Max(x => x.id) + 1;

Ответ 3

int new_id = C_Movement.list.Max(x => (int?)x.id).GetValueOrDefault(-1) + 1;

где GetValueOrDefault - метод Nullable<T>.

Ответ 4

Попробуй это

    public static class LinqExtensions
    {
        public static TValue Max<TSource, TValue>(this IEnumerable<TSource> source, Func<TSource, TValue> selector, TValue defaultValueIfEmpty)
            where TValue : IComparable
        {
            if (source == null)
                throw new ArgumentNullException(nameof(source));
            if (selector == null)
                throw new ArgumentNullException(nameof(selector));
            TValue sum;
            using (IEnumerator<TSource> enumerator = source.GetEnumerator())
            {
                if (!enumerator.MoveNext())
                    return defaultValueIfEmpty;
                sum = selector(enumerator.Current);
                while (enumerator.MoveNext())
                {
                    var num2 = selector(enumerator.Current);
                    if (num2.CompareTo(sum) > 0)
                        sum = num2;
                }
            }
            return sum;
        }

        public static TSource Max<TSource>(this IEnumerable<TSource> source, TSource defaultValueIfEmpty)
            where TSource : IComparable
        {
            if (source == null)
                throw new ArgumentNullException(nameof(source));
            TSource sum;
            using (IEnumerator<TSource> enumerator = source.GetEnumerator())
            {
                if (!enumerator.MoveNext())
                    return defaultValueIfEmpty;
                sum = enumerator.Current;
                while (enumerator.MoveNext())
                {
                    var num2 = enumerator.Current;
                    if (num2.CompareTo(sum) > 0)
                        sum = num2;
                }
            }
            return sum;
        }

    }