今天一个实习学生问我,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方法筛选的结果!