C# Linq--linq to object使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LinqDemo
{
    /// <summary>
    /// LINQ演变
    /// 场景:通过学生集合安装条件筛选
    /// eg:student.age>20;
    /// 1.常规通过方法封装实现
    /// 2.升级[加强]常规方法,改用泛型
    /// 3.采用linq类型实现,在方法和当前类前面使用static修饰,并且方法数据源使用this修饰。eg:参考方法3
    /// 实例: List<T> list = new List<T> list.GetWhere(student=>student.age>30)
    ///                                   数据源.扩展方法(变量=>方法体)
    /// 4.Linq实现[自己编写实现代码]
    /// </summary>
    static class Program
    {
        static void Main(string[] args)
        {
            List<Student> lists = InitData();
            List<Student> outList = GetStudentList<Student>(lists, st => st.Age > 20);
            ///Linq官方自己实现
            //List<Student> outListLinq = lists.Where<Student>(student => student.Age > 20).ToList();
            //linq实现原理[自己实现]
            List<Student> outListLinqItem = lists.GetWhere<Student>(student => student.Age > 20).ToList();
            Console.WriteLine(outList);


            ////////////////////////////////////////////////////////////////////////////////
            string str = "中国你好";
            str.EnumerableMethod();
            Console.ReadKey();
            //疑问?
            //为什么string类型,没有存在EnumerableMethod方法,但是现在可以正常调用。
            //调用方法结果是什么?
            //是通过什么方式来实现的

            // 1.在string 中扩展了EnumerableMethod方法.
            // 2.方法结果是EnumerableMethod方法原型
            ////////////////////////////////////////////////////////////////////////////////

        }
        //1.通过委托,来处理数据刷选
        public static List<Student> GetStudentList(List<Student> list, Func<Student, bool> func)
        {
            List<Student> outList = new List<Student>();
            foreach (var item in list)
            {
                if (func.Invoke(item))
                {
                    outList.Add(item);
                }
            }
            return outList;
        }
        //2.升级为泛型,来处理数据
        public static List<T> GetStudentList<T>(List<T> list, Func<T, bool> func)
        {
            List<T> outList = new List<T>();
            foreach (var item in list)
            {
                if (func.Invoke(item))
                {
                    outList.Add(item);
                }
            }
            return outList;
        }
        //3.使用方法扩展升级,linq类似实现,注意,类和方法名都需要添加static修饰,然后在数据源前加this修饰
        public static List<T> GetStudentLinq<T>(this List<T> list, Func<T, bool> func)
        {
            List<T> outList = new List<T>();
            foreach (var item in list)
            {
                if (func.Invoke(item))
                {
                    outList.Add(item);
                }
            }
            return outList;
        }
        ///4.Linq实现
        ///List<T>实现IEnumerable<T>接口
        public static IEnumerable<TSource> GetWhere<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
        {
            foreach (var item in source)
            {
                if (predicate.Invoke(item))//获取当前Func泛型的返回值
                {
                    //yield枚举器,返回逐条结果
                    yield return item;
                }
            }
        }
        /// <summary>
        /// 初始化数据
        /// </summary>
        /// <returns></returns>
        public static List<Student> InitData()
        {
            List<Student> list = new List<Student>{
                new Student("张杰",10),new Student("王炸",25),new Student("刘老四",80)
            };
            return list;
        }


        ////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// Enumerable接口方法扩展原理
        /// </summary>
        /// <param name="source"></param>
        public static void EnumerableMethod(this string source) 
        {
            Console.WriteLine(source);
        }
    }

    /// <summary>
    /// 学生实体
    /// </summary>
    class Student
    {
        public Student() { }
        public Student(String name, int age)
        {
            this.Name = name;
            this.Age = age;
        }
        public string Name { get; set; }
        public int Age { get; set; }
    }
}

运行结果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章