关于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();
通过展开,就知道这个选择是扯淡的、多余的了。
我没有看过你说的那本书,对那本书的作者,我只能说“抱歉”!