理解lambda在linq中的应用

时间:2023-02-06 19:04:04

LinQ是必须学好的一种查询语言,不得不佩服微软的贡献。现阶段要学好Linq必须了解lambda,关于lambda本身,朋友可以找些资料自己看看,我这只是讲下他的本质。

lambda本质上是一个委托,他是匿名委托,有的资料叫匿名函数,其实lambda本身是从函数式编程语言中发展而来,函数式编程语言里函数是第一等元素,函数的参数,函数的返回值都是函数,程序没有变量,函数嵌套函数。而且函数式编程语言一直存在于象牙塔中,所以在工业界并没有得到通用,不过近年来工业界比较喜欢复古风格,所以函数式编程语言也慢慢的走上了历史的舞台。我们现在的编程叫命令式编程,函数式编程能很好的解决命令式编程不能解决的问题。

例如:

int[] arr = new int[] { 8, 5, 89, 3, 56, 4, 1, 58 };
var m
= from n in arr

    where n < 5 orderby n

    select n;
foreach (var n in
m)
{
console.writeline(n);
}

最后输出结果是:134


这样就能输出arr数组中小于5的数,输出的数据还经过排序输出。

这样的实现以前是自己来实现的。linq能应用的地方很多,但是要使用好还是需要一定的学习的。

前面的案例还能书写成

 var q = arr.Where(p=> p<5).Select(p => p).OrderBy(n=>n);
            foreach (var i in q)
            {
                MessageBox.Show(i.ToString());
            }

效果跟前面的一样,那“p=> p<5”就是一个lambda表达式

我们看看在vs2008中,在where上按F1看看,

Enumerable..::.Where<(Of <(TSource>)>) 泛型方法 (IEnumerable<(Of <(TSource>)>), Func<(Of <(TSource, Int32, Boolean>)>)) 静态定义是

public static IEnumerable<TSource> Where<TSource>( this IEnumerable<TSource> source, Func<TSource, int, bool> predicate )

注意Func<TSource, int, bool> 前面TSource, int是函数的输入,bool是返回类型

如此我们可以这样

 private bool mywhere(int i)
        {
            return i < 5;
        }

private void button3_Click(object sender, EventArgs e)
        {
            int[] arr = new int[] { 8, 5, 89, 3, 56, 4, 1, 58 };
            Func<int, bool> f2 = mywhere;

            var q = arr.Where(f2).Select(p => p).OrderBy(n => n);
            foreach (var i in q)
            {
                MessageBox.Show(i.ToString());
            }
        }

其中 Func<int, bool> f2 = mywhere;是重点,在后面的查询语句中where中使用的f2其实就是回调mywhere方法相当于where(i=>i<5),i是参数

学习lambda是很有用的,特别是结合表达树,当然了如果组装表达树给人的感觉就是一个简单的查询都会被写成狂长的一堆语句,如果你公司是按照代码行计算工资的倒是值得祝贺,就目前看也没办法,只能期待Linq在未来能更好的发展,老实说要能很好的使用Linq必须要解决动态查询(在以前就是拼装SQL语句),要能深刻的理解动态查询就要学好lambda和表达树,关于微软提供的Dynamic.cs早期学习的时候可以少用,等搞清表达树后使用也不迟。关于表达树有机会在和大家聊聊.