LINQ "MaxOrDefault"? - PullRequest
       35

LINQ "MaxOrDefault"?

26 голосов
/ 30 марта 2012

Я новичок в 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) возвращает ноль (и я бы хотел, чтобы он возвращал -1).

Спасибо.

Ответы [ 4 ]

51 голосов
/ 30 марта 2012

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

int new_id = C_Movement.list.Select(x => x.id).DefaultIfEmpty(-1).Max()+1;
3 голосов
/ 27 января 2014

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

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

2 голосов
/ 30 марта 2012

Как насчет:

int new_id = 0;

if (C_Movement.list.Any())
    new_id = C_Movement.list.Max(x => x.id) + 1;
0 голосов
/ 25 апреля 2019

Попробуйте это

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

    }
...