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; }
    }
}

運行結果:

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