探究 List<T> 集合的Where方法是如何实现的

本文详细解释了.NET集合中扩展方法的概念,并通过实例展示了如何使用扩展方法实现集合筛选功能,具体以Movie实体类为例,演示了自定义Where方法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       今天一个实习学生问我,List<T>集合里面的Where方法如何使用。我当时就把鼠标放在方法上,VS的智能提示告诉我,需要传入一个Fun<T,bool>的委托,当时我就说,这里需要传入一个委托,其实就是一个T类型参数,返回bool值的方法。.NET的集合都可以使用select,where等方法进行筛选,于是我告诉他转到定义看看就明白了,如果不明白Fun委托,可以先去百度下,可能理解起来方便点。师者,传道授业解惑也!

      

        这个小伙子还是很听话的,通过F12转到定义一看,不对啊,怎么定义中传入了两个参数啊?

这个this关键字在这里干嘛的?看来这里面大有文章!百度之后发现, this是一个扩展方法。百度经验提供了一个很好的例子!

http://jingyan.baidu.com/article/92255446862662851648f40b.html

什么是扩展方法呢?简单说就是给一个类型增加目前还没有的方法!下面的例子能够说明。

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方法筛选的结果!


 

 


 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值