Хоча ви, безумовно, можете створити такий пристрій із існуючих операторів послідовностей, я б у цьому випадку схильний записати це як спеціальний оператор послідовності. Щось на зразок:
// Returns "other" if the list is empty.
// Returns "other" if the list is non-empty and there are two different elements.
// Returns the element of the list if it is non-empty and all elements are the same.
public static int Unanimous(this IEnumerable<int> sequence, int other)
{
int? first = null;
foreach(var item in sequence)
{
if (first == null)
first = item;
else if (first.Value != item)
return other;
}
return first ?? other;
}
Це досить зрозуміло, коротко, охоплює всі випадки, і не викликає зайвих ітерацій послідовності.
Перетворення цього на загальний метод, який працює над IEnumerable<T>
, залишається як вправа. :-)