小玩意:??运算符与Linq配合使用

今天看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中,根据实际情况,我们也可以引入??运算符来简化我们的代码。
原文地址:https://www.cnblogs.com/TomToDo/p/1224079.html