Ответ 1
Метод DefaultIfEmpty должен помочь:
int new_id = C_Movement.list.Select(x => x.id).DefaultIfEmpty(-1).Max()+1;
Я новичок в 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 вместо этого).
Спасибо.
Метод DefaultIfEmpty должен помочь:
int new_id = C_Movement.list.Select(x => x.id).DefaultIfEmpty(-1).Max()+1;
Как насчет:
int new_id = 0;
if (C_Movement.list.Any())
new_id = C_Movement.list.Max(x => x.id) + 1;
int new_id = C_Movement.list.Max(x => (int?)x.id).GetValueOrDefault(-1) + 1;
где GetValueOrDefault
- метод Nullable<T>
.
Попробуй это
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;
}
}