NET问答: 如何避免在 EmptyEnumerable 上执行 Max() 抛出的异常 ?
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                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() 抛出的异常 ?的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Magicodes.IE.AspNetC
- 下一篇: 记一次 .NET游戏站程序的 CPU 爆
