小技巧:??運算子與Linq配合使用

來源:互聯網
上載者:User
今天看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中,根據實際情況,我們也可以引入??運算子來簡化我們的代碼。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.