【学习笔记】Linq和特性

一、Linq

下面我们来看个示例,自定义一个Linq,实现Where条件筛选

using System;
using System.Collections.Generic;

namespace MyLinqAttribute
{
    /// <summary>
    /// 含有yield的函数说明它是一个生成器,而不是普通的函数。
    /// 当程序运行到yield这一行时,该函数会返回值,并保存当前域的所有变量状态;
    /// 等到该函数下一次被调用时,会从上一次中断的地方开始执行,一直遇到下一个yield, 程序返回值, 并在此保存当前状态;如此反复,直到函数正常执行完成。
    /// 
    /// 迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子,它是一种简化对象间通讯的模式,也是一种非常容易理解和使用的模式。
    /// 简单来说,迭代器模式使得你能够获取到序列中的所有元素,而不用关心其类型是array,list,linked list或者是其他什么序列结构。
    /// 这一点使得能够非常高效的构建数据处理通道(data pipeline),即数据能够进入处理通道,进行一系列的变换,或者过滤,然后得到结果。事实上,这正是Linq的核心模式。
    /// 在.NET中,迭代器模式被IEnumerator和IEnumerable及其对应的泛型接口所封装。如果一个类实现了IEnumerable接 口,那么就能够被迭代;
    /// 调用GetEnumerator方法将返回IEnumerator接口的实现,它就是迭代器本身。迭代器类似数据库中的游标,它是数据序列中的一个位置记录。
    /// 迭代器只能向前移动,同一数据序列中可以有多个迭代器同时对数据进行操作。
    /// </summary>
    public static class ExtendMethod
    {
        /// <summary>
        /// Linq是基于委托的封装,实现逻辑解耦、代码重用
        ///     1、把重复的代码写在这里,把变化的部分通过委托传递
        ///     2、泛型完成对不同类型的数据过滤
        ///     3、迭代器模式,完成了数据的按需获取,延迟加载
        /// </summary>
        public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> resource, Func<T, bool> func)
        {
            foreach (var item in resource)
            {
                Console.WriteLine("进入数据检测"); //写好公共逻辑
                if (func.Invoke(item)) //可变部分交给委托实现逻辑解耦
                {
                    yield return item;//yield跟IEnumerable配对使用(迭代器模式)
                }
            }
        }
    }
}

二、特性

猜你喜欢

转载自www.cnblogs.com/xyh9039/p/12676672.html