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; }
}
}
运行结果: