`
zxlyecf2
  • 浏览: 129597 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

c# 链式编程

    博客分类:
  • C#
阅读更多

先写一段代码,让大家了解或重温一下什么是链式编程:

/// <summary>
        /// EntityFramwork中的链式编程示例
        /// </summary>
        private void Example1()
        {
            using (NorthwindEFEntities northwindEFEntities = new NorthwindEFEntities())
            {
                northwindEFEntities.Employees
                    .Where(e => e.FirstName.StartsWith("C"))
                    .Select(e => e.FirstName)
                    .OrderBy(s => s);
            }            
        }

 这一个基本的查询,执行了三个操作:1.查找FristName以C开头的员工;2.取员工的FirstName;3.将名字排序。

EF中只需要一个语句,通过.将三者链成一个语句。后面还可以链接更多的语句,如果需要。
下面代码作一些演化:

/// <summary>
        /// 链式编程示例2
        /// </summary>
        private static  void Example2()
        {
            Person person = new Person { Name = "Tom" }
                .Run()
                .Sing()
                .Swim();
        }

        class Person
        {
            public string Name { get; set; }

            public Person Run()
            {
                Console.WriteLine("Run");
                return this;
            }
            public Person Swim()
            {
                Console.WriteLine("Swim");
                return this;
            }
            public Person Sing()
            {
                Console.WriteLine("Sing");
                return this;
            }
        }

 这段代码定义了Peoson类,有三个操作Run、Swim、Sing,操作完成后返回自身this(有返回值是链式编程的关键)。返回自身this好比说执行完操作先别走人,还(可能)有其它操作要去做,如Example2中:先造一个People,先命令ta跑步,跑完先别休息再唱歌,再游泳,游泳完OK了。

链式编程是将多个操作(多行代码)通过点号"."链接在一起成为一句代码。(定义不严密,表达能力好的请给修正一下)
以下为常规代码与链式代码的比较:

/// <summary>
        /// 链式编程示例3  对比
        /// </summary>
        private void Example3()
        {
            //链式代码
            Person person = new Person { Name = "Tom" }
                .Run()
                .Sing()
                .Swim()
                .Run()
                .Sing()
                .Swim();
            //常规代码
            Person person2 = new Person();
            person2.Run();
            person2.Sing();
            person2.Swim();
            person2.Run();
            person2.Sing();
            person2.Swim();
        }

 为了增强效果,都执行了两轮操作。个人感觉链式代码更加精炼简洁易读。



链式代码要求操作有返回值,但对于很多操作大都是void型,什么也不返回,这样就很难链起来了。当然也有解决办法,可能不太优雅。
本人使用扩展方法解决这个问题,首先引入一个泛型扩展:

/// <summary>
        /// 先执行操作,再返回自身
        /// </summary>
        public static T Do<T>(this T t, Action<T> action)
        {
            action(t);
            return t;
        }

 下面是调用示例,其中Student类操作都是void型的。

/// <summary>
        /// 链式编程示例4
        /// </summary>
        private static void Example4()
        {
            new Student { Name = "Tom" }
                .Do(s => s.Run())
                .Do(s => s.Sing())
                .Do(s => s.Sing())
                .Do(s => s.Name = "Bob");
        }

        public class Student
        {
            public string Name { get; set; }
            public void Run() { Console.WriteLine("Run"); }
            public void Swim() { Console.WriteLine("Swim"); }
            public void Sing() { Console.WriteLine("Sing"); }
        }

 

3
0
分享到:
评论

相关推荐

    C#链式编程管道式编程示例

    C#链式编程示例主要给大家介绍了关于C#管道式编程的介绍与实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值

    接口和链式编程

    C#开发接口测试小程序 继承 COMMDAL BASEBLL 泛型

    实例讲解C#中的职责链模式

    大家好,欢迎来到老胡的博客,今天我们继续了解设计模式中的职责链模式,这是一个比较简单的模式。跟往常一样,我们还是从一个真实世界的例子入手,这样大家也对这个模式的应用场景有更深刻的理解。...

    地理信息系统算法题——C#

    1、已知一线段AB,在某个方向选择一点P,输入距离d,求线段AB延长距离d后的点坐标; 2、判断两线段是否相交; ...8、编写链式编码程序实现栅格数据的压缩; 9、编程:用垂距法实现矢量数据的压缩。

    数据结构与算法-C#版

    这是C#版的数据结构与算法的代码实现,包括:顺序表,单链表,双链表;顺序栈,链栈;顺序队列,链队列;顺序串;用数组进行特殊矩阵的存储,稀疏矩阵的存储;顺序存储二叉树,链式存储二叉树,哈夫曼树;多重链表...

    Expression解析生成SQL.zip

    Expression自定义生成SQL,可链表、分组、排序、自定义。...对象化操作,链式编程,支持多表复杂关联查询,任意组装sql,自动生成表别名,参数化赋值,防止sql注入,支持SQLServer、MySQL、Oracle、SQLite等多数据库

    30.数据结构(C#语言版)高清版

    1.4.2 泛型编程.........................13 本章小结........20 习题一............20 第2章线性表.....................................22 2.1 线性表的逻辑结构.........................22 2.1.1 线性表的定义....

    数据结构(C#语言版)

    1.4.2 泛型编程.........................................................................................................13 本章小结........................................................................

    数据结构(C#语言版).

    1.4.2 泛型编程.........................................................................................................13 本章小结.........................................................................

    3.数据结构(C#语言版)

    1.4.2 泛型编程.........................................................................................................13 本章小结.........................................................................

    数据结构(c#语言版)

    1.4.2 泛型编程.........................................................................................................13 本章小结.........................................................................

    数据结构(C#语言)

    1.4.2 泛型编程.........................................................................................................13 本章小结.......................................................................

    fastCSharp

    1、数据集合操作支持.net2.0的链式编程体验(此部分现已迁移完毕)。 * 链式编程的核心思想是想到什么就点什么,程序书写思路更流畅。但要注意的是不要把程序写成一行,对于带参数的函数调用,最好是一行一个点,...

    数据结构 (C#语言版)

    1.4.2 泛型编程.........................................................................................................13 本章小结.........................................................................

    C#数据结构

    1.4.2 泛型编程.........................................................................................................13 本章小结........................................................................

    LINQ查询语句与查询方法

    C#是一种通用的编程语言,由微软公司开发和推出,并广泛应用于Windows操作系统和.NET Framework开发中。它是一种面向对象的语言,拥有强大的类型检查和丰富的库支持。 LINQ(Language Integrated Query)是一种查询...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    HTML基础加强、css(包含Div+CSS布局)、JavaScript、Dom(事件、window...链式编程、id选择器、tag选择器、CSS选择器、层次选择器、表单选择器、过滤选择器、复合选择器、节点导航、节点操作、样式操作、事件、动画、...

Global site tag (gtag.js) - Google Analytics