泛型委托 public delegate TResult Func<T, TResult>(
T arg
)
泛型方法:public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)----
应用
List<string> fruits = new List<string> { "apple", "passionfruit", "banana", "mango",
"orange", "blueberry", "grape", "strawberry" };IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6);
foreach (string fruit in query)
Console.WriteLine(fruit);首先 lambda表达式如果换成匿名方法 delegate(string fruit){return fruit.Length < 6;}这样对不对?
其次,目前我只能理解到,因为变量fruits,可以由编译器推出类型TSource 为string是吗?所以,委托Func<TSource, bool> predicate自然就推出是
Func<string, bool> predicate。然后就与对应的匿名方法delegate(string fruit){return fruit.Length < 6;}在返回值与参数类型上一致了,是吧?
最后,我感觉,委托总要通过调用才能发挥作用的。
string str="pea";
predicate(string str);//可是,用了refelctor,没看到有类似的语句。
对于上面的例子,难道是foreach (string fruit in query) 这句才真正通过委托调用的方法吗?==========================
大侠能不能举个简单的详细的例子来说明这一用法啊,我主要是对于泛型委托作为一个泛型方法的参数这种用法比较糊涂,不是理解不了委托作为参数,是理解不了具体是怎么实现的。
T arg
)
泛型方法:public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)----
应用
List<string> fruits = new List<string> { "apple", "passionfruit", "banana", "mango",
"orange", "blueberry", "grape", "strawberry" };IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6);
foreach (string fruit in query)
Console.WriteLine(fruit);首先 lambda表达式如果换成匿名方法 delegate(string fruit){return fruit.Length < 6;}这样对不对?
其次,目前我只能理解到,因为变量fruits,可以由编译器推出类型TSource 为string是吗?所以,委托Func<TSource, bool> predicate自然就推出是
Func<string, bool> predicate。然后就与对应的匿名方法delegate(string fruit){return fruit.Length < 6;}在返回值与参数类型上一致了,是吧?
最后,我感觉,委托总要通过调用才能发挥作用的。
string str="pea";
predicate(string str);//可是,用了refelctor,没看到有类似的语句。
对于上面的例子,难道是foreach (string fruit in query) 这句才真正通过委托调用的方法吗?==========================
大侠能不能举个简单的详细的例子来说明这一用法啊,我主要是对于泛型委托作为一个泛型方法的参数这种用法比较糊涂,不是理解不了委托作为参数,是理解不了具体是怎么实现的。
this.M1("sss");
this.M1(25f);
void M2<Ta>(Action<Ta> act,Ta ta)
{
//...
act.Invoke(ta);
//...
}//...
this.M2(x=> MessageBox.Show(x),"sss");//C#3.0上面还有试过,估计是这样的..它可以自己推断出来
this IEnumerable <TSource> source,
Func <TSource, bool> predicate 这个扩展方法是为IEnumerable <TSource> 泛型接口扩展的方法,所以说只要泛型接口指定了一个泛型参数,where方法的泛型参数就被指定了,剩下的就是一个同这个泛型IEnumerable <TSource> 的泛型参数一样,并且第二个参数是一个bool类型的委托,这个委托“貌似”已经被定义了,这里我对于泛型委托的定义还是有点迷糊public delegate TResult Func <T, TResult>(
T arg
) 如果使用这个委托,根据上面得出他需要返回一个泛型IEnumerable <TSource>,并且参数为bool的一个实例或者匿名方法或者lamba下面是重点了,因为实现了一个泛型接口
List <string> fruits
注意list<t>实现了IEnumerable <T>,根据多态它可以被看做一个IEnumerable <T>,所以它具有where《t》泛型扩展方法
,所以当他(fruits)调用泛型where方法时,实际上是在调用where<string>,我们不必再指定泛型参数,因为在实例化list《string》的时候已经指定了这样唯一要做的就是为where添参数,根据上面对where《string》的定义,要求实例化一个 public delegate bool func<string,bool>(string)的方法,如果么有实例方法,自然是匿名方法delegate(string x){return x.length<6}
addhandler deladd=delegate(int x,int y){return x+y;} 我们在实际应用的时候 不是应该有一句int i=deladd(3,6)// i=9
对吧。
但是 在扩展方法里,即使有这句deladd(3,6)
也应该是这样的形式。
int c=3;
int d=6;
int i=deladd(c,d);
但是,我不明白的是,lambda表达式相当于匿名方法,在我看来,就是直接在参数中定义了委托要调用的方法,但是,参数的值是从那传过去的呢?