Существует ли расширение LINQ или (разумный / эффективный набор расширений LINQ), определяющее, имеет ли коллекция хотя бы элементы «x»?

У меня есть код, который должен знать, что коллекция не должна быть пустой или содержать только один элемент.

В общем, я хочу расширение формы:

bool collectionHasAtLeast2Items = collection.AtLeast(2);

Я могу легко написать расширение, перечисляя коллекцию и увеличивая индексатор, пока не достигну запрошенного размера или не исчерпаю элементы, но есть ли уже что-то в инфраструктуре LINQ, которая могла бы сделать это? Мои мысли (в порядке того, что пришло ко мне):

bool collectionHasAtLeast2Items = collection.Take(2).Count() == 2; или же

bool collectionHasAtLeast2Items = collection.Take(2).ToList().Count == 2;

Казалось бы, это работает, хотя поведение взятия большего количества элементов, чем содержит коллекция, не определено (в документации)Enumerable.Take метододнако, похоже, что он делает то, что ожидал.

Это не самое эффективное решение: либо один раз перечислить, чтобы взять элементы, затем пересчитать снова, чтобы подсчитать их, что не нужно, либо перечислить один раз, чтобы взять элементы, а затем составить список, чтобы получить свойство count, которое не является '. enumerator-y, так как я на самом деле не хочу список.

Это не очень красиво, так как мне всегда приходится делать два утверждения, сначала принимая «x», затем проверяя, действительно ли я получил «x», и это зависит от недокументированного поведения.

Или, возможно, я мог бы использовать:

bool collectionHasAtLeast2Items = collection.ElementAtOrDefault(2) != null;

Однако это семантически не ясно. Может быть, лучше всего обернуть это именем метода, которое означает то, что я хочу. Я предполагаю, что это будет эффективно, я не отразил в коде.

Некоторые другие мысли используютLast(), но я явно не хочу перечислять всю коллекцию.

Или, может бытьSkip(2).Any()опять не семантически не совсем очевиден, но лучше чемElementAtOrDefault(2) != nullхотя я думаю, что они дают одинаковый результат?

Какие-нибудь мысли?

Ответы на вопрос(3)

Ваш ответ на вопрос