public static bool AllEqual<T>(this IEnumerable<T?> values) where T : struct
{
if (!values.Any()) return true;
T? first = values.First();
return values.Skip(1).All(v => first.Equals(v));
}
РЕДАКТИРОВАТЬ: Чтобы получить значение, вы можете вернуть кортеж (успех, значение), как это:
public Tuple<bool, T?> AllEqual<T>(IEnumerable<T?> values) where T : struct
{
if(! values.Any()) return Tuple.Create(true, (T?)null);
T? first = values.First();
bool equal = values.Skip(1).All(v => v.Equals(first));
return Tuple.Create(equal, equal ? first : (T?)null);
}
или вы можете использовать вместо него параметр out:
public static bool AllEqual<T>(this IEnumerable<T?> values, out T? value) where T : struct
{
value = null;
if (!values.Any()) return true;
T? first = values.First();
value = first;
return values.Skip(1).All(v => first.Equals(v));
}