zoukankan      html  css  js  c++  java
  • 小玩意:??运算符与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中,根据实际情况,我们也可以引入??运算符来简化我们的代码。
  • 相关阅读:
    Windows如何自定义U盘盘符、文件夹图标、文件夹背景
    BIN文件如何打开
    Windows COM Surrogate 已停止工作怎么办
    EasyBoot使用方法
    SRS Audio Sandbox没有声音怎么办
    [Compose] 20. Principled type conversions with Natural Transformations
    [Compose] 19. Leapfrogging types with Traversable
    [Compose] 17. List comprehensions with Applicative Functors
    [Compose] 15. Applicative Functors for multiple arguments
    [Algorithm] Coding Interview Question and Answer: Longest Consecutive Characters
  • 原文地址:https://www.cnblogs.com/TomToDo/p/1224079.html
Copyright © 2011-2022 走看看