1. 程式人生 > >探究 List 集合的Where方法是如何實現的

探究 List 集合的Where方法是如何實現的

       今天一個實習學生問我,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方法篩選的結果!