Czy istnieje rozszerzenie LINQ lub (rozsądny / wydajny zestaw rozszerzeń LINQ), które określają, czy kolekcja ma co najmniej elementy „x”?

Mam kod, który musi wiedzieć, że kolekcja nie powinna być pusta ani zawierać tylko jednego elementu.

Ogólnie chcę rozszerzyć formularz:

bool collectionHasAtLeast2Items = collection.AtLeast(2);

Mogę łatwo napisać rozszerzenie, wyliczając kolekcję i zwiększając indeksator, dopóki nie trafię na żądany rozmiar lub nie zabraknie elementów, ale czy jest coś już w strukturze LINQ, która by to zrobiła? Moje myśli (zgodnie z tym, co mi przyszło) są:

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

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

Które wydają się działać, chociaż zachowanie pobierania większej liczby elementów niż zawiera kolekcja nie jest zdefiniowane (w dokumentacji)Enumerable.Take Methodjednak wydaje się, że robi to, czego można się spodziewać.

Nie jest to najbardziej wydajne rozwiązanie, albo wyliczenie raz, aby wziąć elementy, a następnie ponowne wyliczenie, aby je policzyć, co nie jest konieczne, lub wyliczenie raz, aby wziąć elementy, a następnie skonstruowanie listy, aby uzyskać właściwość count, która nie jest wyliczaniem -y, bo tak naprawdę nie chcę listy.

To nie jest ładne, ponieważ zawsze muszę zrobić dwa stwierdzenia, najpierw biorąc „x”, a następnie sprawdzając, czy faktycznie otrzymałem „x”, a to zależy od nieudokumentowanego zachowania.

A może mógłbym użyć:

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

Nie jest to jednak semantycznie jasne. Może najlepiej jest zawinąć to nazwą metody, która oznacza to, czego chcę. Zakładam, że to będzie skuteczne, nie zastanawiałem się nad kodem.

Używają innych myśliLast(), ale wyraźnie nie chcę wyliczać całej kolekcji.

Albo możeSkip(2).Any(), znowu nie semantycznie całkowicie oczywiste, ale lepsze niżElementAtOrDefault(2) != null, choć sądzę, że dają taki sam wynik?

jakieś pomysły?

questionAnswers(3)

yourAnswerToTheQuestion