LINQ 中的 GroupBy 保证

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它总是正确的吗?


喵喔喔
浏览 213回答 4
4回答

收到一只叮咚

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

HUH函数

是的,根据 agroup在这种情况下的含义的定义,组必须既非空也不为空,并且组的序列(IEnumerable或IQueryable)必须是非空的。考虑一下,一个空组从哪里来?一个组必须包含那些根据为匹配定义的任何标准都相同的项目。如果在特定的可能键上没有任何匹配项,则它不能包含在组序列中。因此,它不能为空或空,当然。同时,实际结果GroupBy必须有所有这些组,所以虽然可能有 0 个组(如果有空输入),但不能有null组。删除空检查和空检查是安全的(不能保证空检查不会重新查询,尽管这不太可能实现)。空性检查总是可以安全地省略,因为foreach在空序列的迭代器上,它只会false从第一个得到 a ,因此无论如何MoveNext()都不会在其中运行代码。foreach

繁花不似锦

您还可以检查集合中有多少元素(组本身是一个集合,并且所有组groupResult也是一个集合)。所以你可以检查是否有元素。看看下面的代码:if(groupResult.Count() > 0) { }foreach (var group in groupResult)    if(group.Count() > 0) { }将它与检查null值结合起来:if(group != null && group.Count() > 0) { }这里短路将保证 if groupis nullthen 它不会检查在这种情况下可能引发异常的第二个条件。

千巷猫影

至于null返回值我们可以查看文档该方法是通过使用延迟执行来实现的。立即返回值是一个存储执行操作所需的所有信息的对象。在通过直接调用其 GetEnumerator 方法或使用 foreach 枚举对象之前,不会执行此方法表示的查询没有直接提到不可为空性,但就假定GetEnumerator应该调用它而言,很明显 result 永远不会是null.检查源代码我们将得到相同的结论——创建了新的对象实例,它实际上是非空的。而且我无法想象IGrouping<TKey, TElement>是空的,Key在这种情况下分组应该是什么?
打开App,查看更多内容
随时随地看视频慕课网APP