首页 新闻 会员 周边 捐助

lambda表达式问题

0
[已关闭问题]

 public static class CurryExtensions
    {
        public static Func<TArg2, Func<TArg1,TResult> >  Bind2nd<TArg1, TArg2, TResult>(     

            this Func<TArg1, TArg2, TResult> func )
        {
            return (y) =>(x) => func(x,y );       //这句lambda表达式是什么意思啊

        }
    }


    class Program
    {

        static void Main(string[] args)
        {
            var mylist = new List<double> { 1.0, 3.4, 5.4, 6.54 };
            var newlist = new List<double>();
            Func<double, double, double> func = (x, y) => x + y;    

      //这里为什么是 func.Bind2nd()(3.2)而不是 func.Bind2nd(3.2)呢?

            var funcBound = func.Bind2nd()(3.2);   

            foreach (var item in mylist)
            {
                Console.Write("{0}  ", item);
                newlist.Add(funcBound(item));
            }


            Console.WriteLine();
            foreach (var item in newlist)
            {
                Console.Write("{0}  ", item);
            }
            Console.WriteLine();
        }
    }

小弟最近在看lambda感觉好些地方比较的模糊,望高手解答......

winer2010的主页 winer2010 | 初学一级 | 园豆:200
提问于:2010-08-02 21:51
< >
分享
其他回答(2)
0

function Bind2nd(func) {

  function(y) {

    return function(x) {

      return func(x, y);

    }

  }

}

Bind2nd(function(x, y) { return x + y; });

返回函数的函数的函数……好像我也说不清楚,感觉上面的写法清晰点

Gray Zhang | 园豆:17610 (专家六级) | 2010-08-02 23:34
那这段代码放哪里比较好啊,看得不是很懂,能在细点吗,谢谢了哦
支持(0) 反对(0) winer2010 | 园豆:200 (初学一级) | 2010-08-03 10:50
0

记得linq中也会用到这个,不懂,帮顶。。。

changbluesky | 园豆:854 (小虾三级) | 2010-08-03 16:10
0

 public static Func<TArg2, Func<TArg1,TResult> >  Bind2nd<TArg1, TArg2, TResult>(     

            this Func<TArg1, TArg2, TResult> func )
        {
            return (y) =>(x) => func(x,y ); 

        }

上面的代码的效果是为 Func<TArg2, Func<TArg1,TResult> > 委托类型定义一个扩展方法(Bind2nd<TArg1, TArg2, TResult>) 。扩展方法是一个特殊的静态方法、既然是方法,那就一定有返回值。Bind2nd 方法的返回值就是一个Func<TArg2, Func<TArg1,TResult> >类型的委托实例、那就可以理解   return (y) =>(x) => func(x,y ); 这句话的意思了,就是返回一个 Func<TArg2, Func<TArg1,TResult> >类型的委托。

再来看   Func<double, double, double> func = (x, y) => x + y;    这句话,这句话的意思是 定义一个 委托实例,实例名为 func 。扩展方法是可以像实例方法一样调用 object.Method(); 那这个也可以:func.Bind2nd(),那调用这个方法返回的结果是什么呢,上面已经说了是返回一个委托实例,那也可以 通过 实例名+(参数) 的方式来调用;

所以 var funcBound = func.Bind2nd()(3.2);   这句话的意思很明白了。实际上可以分解成 var tempFunc=func.Bind2nd(); var funcBound=tempFunc(3.2); 现在来看 tempFunc(3.2);返回的结果是什么呢 ?

Func<TArg2, Func<TArg1,TResult> > 这个委托类型两个参数的意思分别是 TArg2 表示参数 就是 3.2,Func<TArg1,Tresult> 表示返回值。就是tempFunc(3.2)返回的结果。他的结果还是个委托实例,那同样可以类似的调用方式调用:funcBound(item);。

上面这个题目,难点就在于,扩展方法、以及Lambda 表达式的使用了。希望能对你有所帮助。

HUHU慈悲 | 园豆:9973 (大侠五级) | 2010-08-11 23:58
谢谢了
支持(0) 反对(0) winer2010 | 园豆:200 (初学一级) | 2010-08-17 20:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册