コレクションが空であってはならず、アイテムが 1 つしか含まれていないことを知る必要があるコードがあります。
一般に、次の形式の拡張が必要です。
bool collectionHasAtLeast2Items = collection.AtLeast(2);
コレクションを列挙し、要求されたサイズに達するか、要素がなくなるまでインデクサーをインクリメントする拡張機能を簡単に作成できますが、これを行う LINQ フレームワークに既に何かありますか? 私の考え(思いついた順)は次のとおりです::
bool collectionHasAtLeast2Items = collection.Take(2).Count() == 2;
また
bool collectionHasAtLeast2Items = collection.Take(2).ToList().Count == 2;
コレクションに含まれる要素よりも多くの要素を取得する動作は定義されていませんが (ドキュメントでは) Enumerable.Take Methodで動作するように見えますが、期待どおりの動作をするようです。
要素を取得するために一度列挙してから、要素を取得するためにもう一度列挙するか、または要素を取得するために一度列挙してから、列挙子ではない count プロパティを取得するためにリストを構築するのは、最も効率的なソリューションではありません。 -y、実際にはリストが必要ないため。
最初に「x」を取得し、次に実際に「x」を受け取ったことを確認するという 2 つのアサーションを常に行わなければならないため、きれいではありません。これは、文書化されていない動作に依存します。
または、おそらく次を使用できます。
bool collectionHasAtLeast2Items = collection.ElementAtOrDefault(2) != null;
ただし、それは意味的に明確ではありません。おそらく、私が望むものを意味するメソッド名でそれをラップするのが最善です。これは効率的だと思いますが、コードには反映していません。
を使用している他の考えもありますがLast()
、コレクション全体を列挙したくありません。
それともSkip(2).Any()
、意味的に完全に明らかではありませんが、 よりも優れてElementAtOrDefault(2) != null
いますが、同じ結果が得られると思いますか?
何かご意見は?