Tengo un código que necesita saber que una colección no debe estar vacía o contener solo un elemento.¿Hay una extensión LINQ o (un conjunto sensato/eficiente de enlínea LINQ) que determine si una colección tiene al menos 'x' elementos?
En general, quiero una extensión de la forma:
bool collectionHasAtLeast2Items = collection.AtLeast(2);
puedo escribir una extensión fácilmente, enumerando sobre la recogida e incrementando un indexador hasta que golpeé el tamaño solicitado, o se queda sin elementos, pero ¿hay algo que ya esté en el marco de LINQ que haría esto? Mis pensamientos (en orden de lo que llegó a mí) son ::
bool collectionHasAtLeast2Items = collection.Take(2).Count() == 2;
o
bool collectionHasAtLeast2Items = collection.Take(2).ToList().Count == 2;
que parecería trabajo, aunque el comportamiento de tomar más elementos de la colección contiene no está definido (en la documentación) Enumerable.Take Method, sin embargo, parece hacer lo que uno esperaría.
No es la solución más eficiente, ya sea enumerando una vez para tomar los elementos, enumerando nuevamente para contarlos, lo cual es innecesario, o enumerando una vez para tomar los elementos, luego construyendo una lista para obtener la propiedad de conteo que no es enumerador-y, ya que en realidad no quiero la lista.
No es lindo ya que siempre tengo que hacer dos afirmaciones, primero tomando 'x', luego comprobando que en realidad recibí 'x', y depende del comportamiento no documentado.
O quizás podría usar:
bool collectionHasAtLeast2Items = collection.ElementAtOrDefault(2) != null;
Sin embargo, eso no es semánticamente clara. Quizás lo mejor es envolverlo con un nombre de método que signifique lo que quiero. Asumo que esto será eficiente, no he reflexionado sobre el código.
Algunos otros pensamientos están usando Last()
, pero explícitamente no quiero enumerar toda la colección.
O tal vez Skip(2).Any()
, de nuevo no completamente semánticamente obvio, pero mejor que ElementAtOrDefault(2) != null
, aunque creo que producen el mismo resultado?
¿Alguna idea?
¿Por qué no crear una colección, cargar algunos datos y probar? – Paparazzi
La página a la que enlaza tiene un comentario 'Tome enumera fuente y cede elementos hasta que los elementos de recuento hayan sido cedidos o la fuente no contenga más elementos' que pueda leerse como" si la lista fuente es más corta que el conteo, entonces solo eso se devuelve una lista breve " –
@HansKesting - probablemente dijo eso hasta que los abogados se enteraron :) –