我的代码需要知道集合不应为空或仅包含一项。
一般来说,我想要形式的扩展:
bool collectionHasAtLeast2Items = collection.AtLeast(2);
我可以轻松编写扩展,枚举集合并递增索引器,直到达到请求的大小或用完元素,但是 LINQ 框架中是否已有某些功能可以执行此操作?我的想法(按我想到的顺序)是:
bool collectionHasAtLeast2Items = collection.Take(2).Count() == 2;
or
bool collectionHasAtLeast2Items = collection.Take(2).ToList().Count == 2;
尽管未定义获取比集合包含的元素更多的元素的行为(在文档中),但这似乎可行可枚举.Take 方法 http://msdn.microsoft.com/en-us/library/bb503062.aspx然而,它似乎正如人们所期望的那样。
这不是最有效的解决方案,要么枚举一次以获取元素,然后再次枚举以对它们进行计数,这是不必要的,或者枚举一次以获取元素,然后构造一个列表以获取不是枚举器的 count 属性-y,因为我实际上并不想要该列表。
这并不漂亮,因为我总是必须做出两个断言,首先采用“x”,然后检查我是否确实收到了“x”,并且这取决于未记录的行为。
或者也许我可以使用:
bool collectionHasAtLeast2Items = collection.ElementAtOrDefault(2) != null;
然而,这在语义上并不清晰。也许最好的方法是用一个代表我想要的方法名称来包装它。我假设这将是有效的,我还没有反映在代码上。
其他一些想法正在使用Last()
,但我明确不想枚举整个集合。
或者可能Skip(2).Any()
,同样在语义上并不完全明显,但比ElementAtOrDefault(2) != null
,尽管我认为它们会产生相同的结果?
有什么想法吗?