今天看ScottGu's Blog,看到這樣一篇:The C# ?? null coalescing operator (and using it with LINQ) 。
覺得蠻好玩的,想想後面可能用得上,就打算把大牛的文章搬到自己家了,E文不好,我就按我自己的理解寫,原文翻譯留待其他牛人去辛苦吧~
留心下MSDN會發現?:運算子和??運算子做的事情幾乎是一樣的,只是前者適用面更廣些(自我感覺),抄了MSDN的教條列出以作區別:
1).?: 運算子(C# 參考)
條件運算子 (?:) 根據布爾型運算式的值返回兩個值中的一個。條件運算子的格式如下
condition ? first_expression : second_expression;
2).?? 運算子(C# 參考)
如果 ?? 運算子的左運算元非 null,該運算子將返回左運算元,否則返回右運算元。
這樣一列出就發現他們都是在簡化if判斷運算式,但是?? 運算子重點是關注判斷對象是不是null,然後再給出結果。這裡ScottGu給了一個??運算子的例子,見
因為message並非null,所以result返回的結果是"helllo world".所以如果想要返回的結果是"It's was null".那麼應該是:
那麼??運算子是不是僅僅只適用於參考型別呢?它在實值型別裡也可以用嗎?ScottGu緊接著給出了一個使用實值型別的例子,見:
同圖1,由於number不為null,因此result返回的結果是number的值,而不是0,要返回0可以這樣操作:
說了這樣一大段??運算子的東西,現在該進入
本文主題了,在
Linq裡使用??運算子。
ScottGu在這裡用準備使用XLinq(Linq to XML),因此資料來源是個XML檔案:contacts.xml。XML檔案結構如:
接下來,編寫C#代碼讀取XML檔案的內容,將讀取到的資料繫結到GridView,顯示的欄位依次是:"Name","Title","Email","YearsAtCompany"。
擷取資料的代碼如下:
介面代碼這裡就不囉嗦了,拖個GridView放在頁面上就行,運行這個樣本程式,顯示如下:
這裡停頓下,寫到這裡,會發現代碼裡面毫無??運算子的蹤跡,莫急,繼續往下,老外寫東東,總是喜歡由淺入深,一點一點的擠牙膏:
修改下原有的xml檔案,新添加一個<Contact>節,裡面的<YearsAtCompany>子位元組剔掉,結構圖如下:
原有的代碼必須進行修改了,因為重新查詢時,"YearsAtCompany"值是為null的整數,所以我們必須用(int?)替換原來的(int)類型來轉換
"YearsAtCompany"值,代碼如下:
單單用(int?)替換(int)就完了嗎?我覺得不可能,運行後的頁面證明了這一點:
呃,都有數字,唯獨第三條的"YearsAtCompany"值是個大白板,醜陋!這裡如果為null,應該被替換成0才對。
哈,現在就可以讓??運算子出馬了,有了它就好辦多了,改進代碼如下:
進過這樣一番折騰,頁面終於出現我們想要的效果了:
這裡是在XLinq裡用到??運算子,同樣的,在其他類型的Linq中,根據實際情況,我們也可以引入??運算子來簡化我們的代碼。