日期:2014-05-17  浏览次数:20449 次

关于对扩展方法Where的一些疑问
以前一直用.Where(T=>T.Name=='ABC')这种写法,虽然知道Where是扩展方法,但是不是很理解Where里面为什么要这么写,只知道这是lambda写法,后来听说这种lambda写法实际就是匿名方法,最近看了下lambda的文章大概知道了,我在这里说下我对.Where()和里面lambda写法的理解:

查看Where的定义public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)

得知Where是扩展方法,参数是一个类型为Func<TSource, bool>的委托实例,返回类型是IEnumerable<TSource>。

也就是在实现了IEnumerable<T>接口的实例的情况下才可以使用这个Where扩展方法,其次这个扩展方法返回的也是IEnumerable<T>对象,再看Where的参数predicate,原来是个委托对象,这个委托返回值是bool类型的,而参数类型是T。也就是说这个参数predicate,实际上也就是一个匿名方法,那么我猜Where可以这样理解:
.Where(T=>T.Name=='ABC')
理解成
.Where(delegate(T){return T.Name=='ABC'})

关于Where内部如何实现的,我的理解如下obj.Where(T=>T.Name=='ABC'),匿名方法一旦返回true,就把当前T的实例,放入临时的IEnumerable<T>对象中,当遍历完所有obj的T类型的实例后,返回这个临时的IEnumerable<T>对象。

我想问一下,这样理解有问题么?

------解决方案--------------------
感觉没有问题,应该是这样
------解决方案--------------------
我们好几个项目都用了这个lambda表达式,都没怎么深入的去研究,向楼主学习。
------解决方案--------------------
这个理解也没有问题,
扩展方法where方法大概是这样的吧(方法作为参数)

public Object Where(this Object a,delegate b){
Object rs = new Object();
foreach(var o in a)
{
if( b()){
rs.add(o); 
}
}
return rs;
}