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; }
}
}
運行結果: