日期:2014-05-16  浏览次数:21277 次

关于Kinect书中源代码中的Lambda表达式
各位高手,小弟刚接触C#和Kinect,正在学习《Kinect应用开发实践》一书,在第9章“自动锁屏案例”中,有两个Lambda表达式不是很清楚: PreviousDepthAvgValueList.Add(depthAvg);
                     var avgOfdepthAvgList = PreviousDepthAvgValueList.Average(value => value);

                     PixelData = new short[DFrame.PixelDataLength];
                     DFrame.CopyPixelDataTo(PixelData);

                     //计算当前深度值的平均值
                    var depthAvg = PixelData.Average(pixel => pixel);

请问第一处value =>value 和pixel =>pixel是什么意思啊?=>拉布达运算符意思不是goes  to吗?怎么运算符两边都是相同的呢?另外本没有定义value和pixel两个变量,这里它们只是一个参数还是怎么样?

 请各位高手不吝指教,谢谢!!
------解决方案--------------------
Average   就是求平均值,下边的代码
    var depthAvg = PixelData.Average(pixel => pixel);
这样写也是可以的:
    var depthAvg = PixelData.Average();

http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
------解决方案--------------------
        public static double Average<TSource>(this IEnumerable<TSource> source, Func<TSource, double> selector)
        {
            return source.Select<TSource, double>(selector).Average();
        }


lamda表达式是一种“语法糖”,通过c#编译器(实际上vb.net编译器也支持lamda)的语义处理,它将表达式 x=>x 编译为一个 source 委托(这里的参数叫做selector的部分),然后后一个Average方法调用了前一个Average方法。

就你给出的代码来看,你的这个代码是有点“扯淡”了。直接写
var avgOfdepthAvgList = PreviousDepthAvgValueList.Average();

就足以了。而它调用了后一个Average方法,毫无意义!
------解决方案--------------------
编译为一个 source 委托  -->    编译为一个针对source 数据集合进行Select处理所用的委托函数

实际上,你贴的代码就等于
var avgOfdepthAvgList = PreviousDepthAvgValueList.Select(x=>x).Average();


通过展开,就知道这个选择是扯淡的、多余的了。

我没有看过你说的那本书,对那本书的作者,我只能说“抱歉”!