为了账号安全,请及时绑定邮箱和手机立即绑定

LINQ 中的 GroupBy 保证

LINQ 中的 GroupBy 保证

C#
喵喔喔 2022-06-19 16:43:15
GroupBy 是否保证在结果和组上都可以安全地被“foreach'ed”?var groupResult = list.GroupBy();if(guarantees == false) // want to remove this check   if(groupResult==null)      return;foreach(var group in groupResult){    if(guarantees == false)        if(group==null || group.Count()==0)           continue;    foreach(var element in group)    {         //do something    }}结果是否GroupBy始终保证为非空,如果存在任何组,GroupBy我们可以假设该组为非空吗?换句话说,我可以假设guarantees它总是正确的吗?
查看完整描述

4 回答

?
收到一只叮咚

TA贡献1821条经验 获得超5个赞

没有明确的保证,但按照惯例,包括所有 LINQ 方法在内的所有 LINQ 方法GroupBy都将始终返回非空条目,因此null可以安全地省略 -check。否则查询的可组合性将被破坏,您也会null在文档中看到很多 -checks,例如在Group query results中。

每个分组结果也将至少有一个条目,否则它将违反其合同。


查看完整回答
反对 回复 2022-06-19
?
HUH函数

TA贡献1836条经验 获得超4个赞

是的,根据 agroup在这种情况下的含义的定义,组必须既非空也不为空,并且组的序列(IEnumerableIQueryable)必须是非空的。

考虑一下,一个空组从哪里来?一个组必须包含那些根据为匹配定义的任何标准都相同的项目。如果在特定的可能键上没有任何匹配项,则它不能包含在组序列中。因此,它不能为空或空,当然。

同时,实际结果GroupBy必须有所有这些组,所以虽然可能有 0 个组(如果有空输入),但不能有null组。

删除空检查和空检查是安全的(不能保证空检查不会重新查询,尽管这不太可能实现)。

空性检查总是可以安全地省略,因为foreach在空序列的迭代器上,它只会false从第一个得到 a ,因此无论如何MoveNext()都不会在其中运行代码。foreach


查看完整回答
反对 回复 2022-06-19
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

您还可以检查集合中有多少元素(组本身是一个集合,并且所有组groupResult也是一个集合)。所以你可以检查是否有元素。


看看下面的代码:


if(groupResult.Count() > 0) { }

foreach (var group in groupResult)

    if(group.Count() > 0) { }

将它与检查null值结合起来:


if(group != null && group.Count() > 0) { }

这里短路将保证 if groupis nullthen 它不会检查在这种情况下可能引发异常的第二个条件。


查看完整回答
反对 回复 2022-06-19
?
千巷猫影

TA贡献1829条经验 获得超7个赞

至于null返回值我们可以查看文档

该方法是通过使用延迟执行来实现的。立即返回值是一个存储执行操作所需的所有信息的对象。在通过直接调用其 GetEnumerator 方法或使用 foreach 枚举对象之前,不会执行此方法表示的查询

没有直接提到不可为空性,但就假定GetEnumerator应该调用它而言,很明显 result 永远不会是null.

检查源代码我们将得到相同的结论——创建了新的对象实例,它实际上是非空的。

而且我无法想象IGrouping<TKey, TElement>是空的,Key在这种情况下分组应该是什么?


查看完整回答
反对 回复 2022-06-19
  • 4 回答
  • 0 关注
  • 212 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号