我的代码需要知道集合不应为空或仅包含一项。
一般来说,我想要表单的扩展:
bool collectionHasAtLeast2Items = collection.AtLeast(2);
我可以轻松编写扩展,枚举集合并递增索引器,直到达到请求的大小或用完元素,但是 LINQ 框架中是否已经存在可以执行此操作的内容?我的想法(按我想到的顺序)是:
bool collectionHasAtLeast2Items = collection.Take(2).Count() == 2;
或者
bool collectionHasAtLeast2Items = collection.Take(2).ToList().Count == 2;
这似乎可行,尽管没有定义(在文档中)Enumerable.Take Method,但它似乎符合人们的预期。
这不是最有效的解决方案,要么枚举一次以获取元素,然后再次枚举以计算它们,这是不必要的,或者枚举一次以获取元素,然后构造一个列表以获得不是枚举器的计数属性-y,因为我实际上并不想要该列表。
这并不漂亮,因为我总是要做出两个断言,首先是“x”,然后检查我是否真的收到了“x”,这取决于未记录的行为。
或者我可以使用:
bool collectionHasAtLeast2Items = collection.ElementAtOrDefault(2) != null;
但是,这在语义上并不明确。也许最好的办法是用一个方法名来包装它,这意味着我想要的。我假设这将是有效的,我没有反映在代码上。
其他一些想法正在使用Last()
,但我明确不想枚举整个集合。
或者也许Skip(2).Any()
,在语义上也不完全明显,但比 更好ElementAtOrDefault(2) != null
,尽管我认为它们会产生相同的结果?
有什么想法吗?