探究 List 集合的Where方法是如何實現的
阿新 • • 發佈:2019-01-25
今天一個實習學生問我,List<T>集合裡面的Where方法如何使用。我當時就把滑鼠放在方法上,VS的智慧提示告訴我,需要傳入一個Fun<T,bool>的委託,當時我就說,這裡需要傳入一個委託,其實就是一個T型別引數,返回bool值的方法。.NET的集合都可以使用select,where等方法進行篩選,於是我告訴他轉到定義看看就明白了,如果不明白Fun委託,可以先去百度下,可能理解起來方便點。師者,傳道授業解惑也!
這個小夥子還是很聽話的,通過F12轉到定義一看,不對啊,怎麼定義中傳入了兩個引數啊?
這個this關鍵字在這裡幹嘛的?看來這裡面大有文章!百度之後發現, this是一個擴充套件方法。百度經驗提供了一個很好的例子!
什麼是擴充套件方法呢?簡單說就是給一個型別增加目前還沒有的方法!下面的例子能夠說明。
static class ListExtension
{
public static int GetLength(this string str)
{
return str.Length;
}
}
這裡的GetLength就是擴充套件方法,那該怎麼用這個擴充套件方法呢?
string mystr = "Hello";
Console.WriteLine(mystr.GetLength());
輸出結果是:5
那麼,集合的Where怎麼實現的呢?我捉摸了一下,寫了一個例子!
--------------------------------------------------分割線--------------------------------------------------------------------------
實體類
public class Movie { public int ID { get; set; } public string Title { get; set; } public DateTime ReleaseDate { get; set; } public string Genre { get; set; } public decimal Price { get; set; } }
擴充套件方法
static class ListExtension
{
public static List<Movie> MyWhere(this List<Movie> list, Func<Movie, bool> fun)
{
List<Movie> listMovie = new List<Movie>();
foreach (Movie m in list)
{
if (fun(m))
{
if(!listMovie.Contains(m))
listMovie.Add(m);
}
}
return listMovie;
}
}
static void Main(string[] args)
{
List<Movie> list = new List<Movie>()
{
new Movie(){ ID = 1, Genre = "Action", Price = 10, ReleaseDate = DateTime.Now, Title = "Good1" },
new Movie(){ ID = 2, Genre = "Action", Price = 10, ReleaseDate = DateTime.Now, Title = "Good2" },
new Movie(){ ID = 3, Genre = "Action", Price = 10, ReleaseDate = DateTime.Now, Title = "Good3" },
new Movie(){ ID = 4, Genre = "Action", Price = 10, ReleaseDate = DateTime.Now, Title = "Good4" }
};
List<Movie> r1 = list.Where(m => m.ID == 1).ToList<Movie>();
foreach (Movie m in r1)
{
Console.WriteLine("Title: " + m.Title);
}
string str = "Good2";
List<Movie> r2 = list.MyWhere(x => x.Title == str);
foreach (Movie m in r2)
{
Console.WriteLine("Title: " + m.Title);
}
//string mystr = "Hello";
//Console.WriteLine(mystr.GetLength());
Console.ReadKey();
}
結果
這個good2就是我們自己寫的MyWhere方法篩選的結果!