日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NET问答: 如何避免在 EmptyEnumerable 上执行 Max() 抛出的异常 ?

發布時間:2023/12/4 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NET问答: 如何避免在 EmptyEnumerable 上执行 Max() 抛出的异常 ? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

咨詢區

Naor

我有下面的一個查詢:

int?maxShoeSize?=?Workers.Where(x?=>?x.CompanyId?==?8).Max(x?=>?x.ShoeSize);

如果 Workers.Where(x => x.CompanyId == 8) 沒有查到任何 Workers 的話,上面的代碼將會拋出異常。

現在的想法是:查不到的話 query 可以返回 0,但千萬不要拋異常,我該如何修改上面的 query 呢?

回答區

Ron K.

可以用 IEnumerable 的擴展方法 DefaultIfEmpty() 來避免這種尷尬,參考如下代碼。

class?Program{static?void?Main(string[]?args){List<Worker>?Workers?=?new?List<Worker>(){new?Worker(){?CompanyId=1,?CompanyName="tweet",?ShoeSize=10?},new?Worker(){?CompanyId=2,?CompanyName="google",?ShoeSize=20?},};int?maxShoeSize?=?Workers.Where(x?=>?x.CompanyId?==?8).Select(x?=>?x.ShoeSize).DefaultIfEmpty(0).Max();Debug.WriteLine($"maxShoeSize={maxShoeSize}");}}class?Worker{public?int?CompanyId?{?get;?set;?}public?string?CompanyName?{?get;?set;?}public?int?ShoeSize?{?get;?set;?}}

輸出結果:

maxShoeSize=0

當然上面的 0 不是必須的,你可以改成其他的任何數。

CptRobby

樓上那哥們提供的方案雖然可以正常運行,但看起來不是很入眼,可以改造成下面這樣。

int?maxShoeSize?=?Workers.Where(x?=>?x.CompanyId?==?8).Select(x?=>?(int?)x.ShoeSize).Max()????0;

代碼看起來是不是有點冗長,最好的方式還是自定義一個 擴展方法,如下代碼所示:

public?static?int?MaxOrDefault<T>(this?IQueryable<T>?source,?Expression<Func<T,?int?>>?selector,?int?nullValue?=?0) {return?source.Max(selector)????nullValue; }

為了簡單,這個擴展方法僅處理了 int 類型,你可以改成任意類型如:(long,double,...),接下來可以繼續改造一下調用方。

int?maxShoeSize?=?Workers.Where(x?=>?x.CompanyId?==?8).MaxOrDefault(x?=>?x.ShoeSize);

希望我的答案可以幫助到更多人。

點評區

小編從來不敢在 Empty Collection 上做 Max,畢竟被坑的不是一次兩次了,所以每次都提前判斷集合是否存在值再執行 Max,沒想到還有神奇的擴展方法 DefaultIfEmpty 和 可空類型 可以幫忙搞定,感覺學的都忘了????????????。

總結

以上是生活随笔為你收集整理的NET问答: 如何避免在 EmptyEnumerable 上执行 Max() 抛出的异常 ?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。