lambda表达式的作用是简化匿名函数的编写。 匿名函数的作用是类库允许你传入一个你自己写的函数,实现代码功能的自定义。 比如说,一个排序代码如下 void sort<T>(T[] arr) { for (int i = 0; i < arr.Count() - 1; i++) for (int j = 0; j < arr.Count() - i; j++) { if (arr[i]比arr[i+1]大) { T temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } } 很明显,这个排序算法所有地方都很好写,唯一难写的就是“arr[i]比arr[i+1]大” 因为按照什么规则排序,不同人有不同的需求,不同的T有不同的实现方法。 类库不能自己实现,也不能穷尽所有可能,那么为了让sort代码通用,必须在这个位置上“插入”由调用者提供的代码。 这时候,匿名委托,或者lambda就有用了。我们可以这么实现 void sort<T>(T[] arr, Func<T,T,int> comp) { for (int i = 0; i < arr.Count() - 1; i++) for (int j = 0; j < arr.Count() - i; j++) { if (comp(arr[i],arr[i+1]) > 0) //调用comp这个匿名委托,我们约定,如果相等,返回0,前者大于后者,返回>0,前者小于后者,返回小于0的整数。 { T temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } } 我们就可以调用了,比如 class User { public string Name; public int Age; } User[] users = { ... }; sort(users, (u1, u2) => u1.Age - u2.Age); 这样就实现了按照年龄排序 sort(users, (u1, u2) => u1.Name.CompareTo(u2.Name)); 这样就实现了按照姓名排序 sort(users, (u1, u2) => u1.Name.Length - u2.Name.Length); 这样就实现了按照姓名的字母数排序 sort(users, (u1, u2) => u1.Age == u2.Age ? u1.Name.CompareTo(u2.Name) : u1.Age - u2.Age ); 这样就实现了先按照年龄排序,如果年龄相同,再按照姓名排序 sort(users, (u1, u2) => u2.Age - u1.Age); 这样就实现了按照年龄倒排序 ... 可见,把比较的过程让调用者自定义,那么无论他有什么需求,他都可以实现,而sort获得了无限的通用性和扩展性 这就是使用lambda表达式的好处。 反之,不这么做,那么要么sort实现不了用户的需求,用户要实现排序,仅仅是排序规则不同,就要把sort的代码自己实现一遍。 要么sort代码就会很复杂,需要考虑到各种用户的不同排序规则,这样才能写出尽可能通用的代码,而且无论多么通用,总是有边界的,总会遇到无法满足要求的时候。
[quote=引用 20 楼 初出茅庐的孩子的回复:][quote=引用 19 楼 caozhy 的回复:] [quote=引用 17 楼 初出茅庐的孩子 的回复:] [quote=引用 10 楼 caozhy 的回复:] [quote=引用 9 楼 以专业开发人员为伍 的回复:] 嗯 => 符号除了 lamda 表达式,再有可能就是表示“大于或者等于”了
你们为什么那么多人把 lambda 写成 lamda,难道你们读这个单词不是蓝布哒,而是栏目哒?好奇怪。
[quote=引用 32 楼 caozhy 的回复:] 你们为什么那么多人把 lambda 写成 lamda,难道你们读这个单词不是蓝布哒,而是栏目哒?好奇怪。
[quote=引用 1 楼 exception1992 的回复:] lambda表达式专属,action或者func委托用的最多。
你先把因为自己不识 lamda 表达式而多余地产生“其它使用场景以及表达的语法意义”的找出来,这个最重要。
lambda表达式专属,action或者func委托用的最多。
你能真正理解 lamda 表达式都有哪些使用使用场景,就知道 => 都有那些场景了。
110,534
社区成员
642,575
社区内容
加载中
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧