¿Existe una extensión de LINQ o (un conjunto razonable / eficiente de entiendas de LINQ) que determine si una colección tiene al menos elementos 'x'?

Tengo un código que necesita saber que una colección no debe estar vacía o contener solo un elemento.

En general, quiero una extensión del formulario:

bool collectionHasAtLeast2Items = collection.AtLeast(2);

Puedo escribir una extensión fácilmente, enumerando sobre la colección e incrementando un indexador hasta que alcance el tamaño solicitado, o me quede sin elementos, pero ¿hay algo en el marco de LINQ que pueda hacer esto? Mis pensamientos (en orden de lo que se me ocurrió) son:

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

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

Lo que parece funcionar, aunque el comportamiento de tomar más elementos de los que contiene la colección no está definido (en la documentación)Enumerable.Tome MétodoSin embargo, parece hacer lo que uno esperaría.

No es la solución más eficiente, ya sea enumerar una vez para tomar los elementos, luego enumerarlos nuevamente para contarlos, lo cual no es necesario, o enumerarlos una vez para tomar los elementos, luego construir una lista para obtener la propiedad count que no es un enumerador -Y, ya que en realidad no quiero la lista.

No es bonito, ya que siempre tengo que hacer dos aserciones, primero tomando 'x', luego verificando que en realidad recibí 'x', y depende de un comportamiento no documentado.

O tal vez podría usar:

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

Sin embargo, eso no es semánticamente claro. Quizás lo mejor es envolver eso con un nombre de método que signifique lo que quiero. Supongo que esto será eficiente, no he reflexionado sobre el código.

Algunos otros pensamientos están usandoLast(), pero explícitamente no quiero enumerar a través de toda la colección.

O tal vezSkip(2).Any(), de nuevo no semánticamente completamente obvio, pero mejor queElementAtOrDefault(2) != null, aunque creo que producen el mismo resultado?

¿Alguna idea?

Respuestas a la pregunta(3)

Su respuesta a la pregunta