Существует ли расширение 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
хотя я думаю, что они дают одинаковый результат?
Какие-нибудь мысли?