1.接下来我们利用Lambda表达式实现一下类似于Enumerable类的Where扩展方法
public static class MyExt
{
public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> data,Func<T,bool> func)
{
//什么样的对象可以被foreach遍历 实现了IEnumerable接口的对象
List<T> list = new List<T>() ;
foreach (T item in data)
{
if(func(item))
{
list.Add(item);
}
}
return list;
}
}
写入上面的代码,根据传入的条件来进行判断。
最后我们在Main方法中进行测试
static void Main(string[] args)
{
int[] nums = { 1, 24, 35, 3, 423, 432, 24 };
IEnumerable<int> data =nums.MyWhere(a => a > 30);
nums.Where(a=>a>30);//用于进行反编译写的
foreach (var item in data)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
接下来我们看.NET自带的这个Where方法最后反编译出来是什么样子的
private static void Main(string[] args)
{
int[] data = new int[] { 1, 24, 35, 3, 423, 432, 24 };
IEnumerable<int> enumerable = data.MyWhere<int>(a => a > 30);
from a in data
where a > 30
select a;
foreach (int num in enumerable)
{
Console.WriteLine(num);
}
Console.ReadKey();
}
from a in data
where a>30
select a;这就是编译出来的结果!
接下来我们对字符串数组进行筛选
string[] strs = { "123","24","beijing","chengdu","shanghai"};
IEnumerable<string> data = strs.MyWhere(a => a.Contains("s"));
foreach (var item in data)
{
Console.WriteLine(item);
}
Console.ReadKey();
我们还可以根据字符串的长度来进行筛选
string[] strs = { "123", "24", "beijing", "chengdu", "shanghai" };
IEnumerable<string> data = strs.MyWhere(a => a.Length>5);
foreach (var item in data)
{
Console.WriteLine(item);
}
最后我们来设置断点来看看程序具体是怎么执行的
程序进入MyWhere方法
然后进入foreach循环进行判断
最后将满足的结果加入List中,最后判断完以后返回
有同学可能会问,为什么要求返回IEnumerable<T> 可以返回一个List集合呢?
我们转到List的定义去看看
发现List继承了接口,所以根据里氏转换原则是可以成功的。
就比如你要返回一个object对象,最终你可以返回一个字符串,整型或者,自定义引用类型
因为object是一切对象的基类!
---本博客是学习以后记录知识,如有侵权,请联系删除!!!