亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 208 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號