相关疑难解决方法(0)

是否有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属性-y,因为我实际上不想要列表.

它并不漂亮,因为我总是要做两个断言,首先取'x',然后检查我实际收到'x',这取决于无证件的行为.

或许我可以使用:

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

但是,这在语义上并不明确.也许最好的方法是使用方法名称来包装它,这意味着我想要的东西.我假设这将是有效的,我没有反映在代码上.

其他一些想法正在使用Last(),但我明确地不想枚举整个集合.

或者,也许Skip(2).Any(),再次在语义上并不完全明显,但更好ElementAtOrDefault(2) != null,虽然我认为它们会产生相同的结果?

有什么想法吗?

.net c# linq performance enumeration

8
推荐指数
1
解决办法
291
查看次数

(计数> 1)短路Linq

其中一个优点linq.Any()是,一旦返回第一个结果,它就会短路,O(1)也不是O(n).

如果我想检查Linq.Count() > nwhere n> 1,那么短路表达式的最佳方法是什么,这样当Linq.Count()接近n时它不会显着减慢速度,但是当Linq.Count加快速度时()很大.

c# linq

2
推荐指数
1
解决办法
160
查看次数

标签 统计

c# ×2

linq ×2

.net ×1

enumeration ×1

performance ×1