c#当中“=>”都有哪些使用场景

啊宝儿姐 2019-02-15 11:35:43
加精
最常见的莫过于lambda表达式里,"参数=>函数"。其它使用场景以及表达的语法意义,欢迎回复,我将整理大家的回复,写个博客供参考。
...全文
9966 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
morehah 2020-09-08
  • 打赏
  • 举报
回复
引用 8 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:
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代码就会很复杂,需要考虑到各种用户的不同排序规则,这样才能写出尽可能通用的代码,而且无论多么通用,总是有边界的,总会遇到无法满足要求的时候。
没有格式化,看着想哭
qq_42254981 2019-07-26
  • 打赏
  • 举报
回复
引用 27 楼 yz_zhangbiao 的回复:
[quote=引用 20 楼 初出茅庐的孩子的回复:][quote=引用 19 楼 caozhy 的回复:] [quote=引用 17 楼 初出茅庐的孩子 的回复:] [quote=引用 10 楼 caozhy 的回复:] [quote=引用 9 楼 以专业开发人员为伍 的回复:] 嗯 => 符号除了 lamda 表达式,再有可能就是表示“大于或者等于”了
要这么说 int i = 10; while (i --> 0) Console.WriteLine(i); 这个--> 还叫做"趋向于"运算符。[/quote] 这些写法好刁钻,请问用处多吗?[/quote] 刁钻么?只是空格惹得祸 一般写作 while (i-- > 0)[/quote] 。。。。。。。。。[/quote] *****。。。。。。[/quote] 其实也是这样的 while ((i-- )> 0) { } 先减再判断
hez2010 2019-06-17
  • 打赏
  • 举报
回复
做 lambda 演算,比如可以实现柯里化函数调用:

Func<T, Func<U, V>> Curry<T, U, V>(Func<T, U, V> f) => x => y => f(x, y);

然后现在比如有一个加法函数:
var add = new Func<int, int, int>((x, y) => x + y);
那么就不需要一次性向里面传入所有值,可以柯里化之后一个一个传值:
原本调用方法:add(1, 5) // 返回 6
柯里化后:var add2 = Curry(add);
现在的调用:add2(1)(5) // 返回 6

有了 lambda 进一步就可以做函数的复合,做 Monad,执行 application 操作等等
weixin_45037487 2019-05-09
  • 打赏
  • 举报
回复
引用 8 楼 caozhy 的回复:
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代码就会很复杂,需要考虑到各种用户的不同排序规则,这样才能写出尽可能通用的代码,而且无论多么通用,总是有边界的,总会遇到无法满足要求的时候。
层主举的这个例子很好
suiexing 2019-05-05
  • 打赏
  • 举报
回复
static void Main()
=> RunServerAsync().Wait();
sdghchj 2019-02-18
  • 打赏
  • 举报
回复
引用 32 楼 caozhy 的回复:
你们为什么那么多人把 lambda 写成 lamda,难道你们读这个单词不是蓝布哒,而是栏目哒?好奇怪。
b是不发音的
xiaoxiangqing 2019-02-18
  • 打赏
  • 举报
回复
用在lambda表达式里
threenewbee 2019-02-18
  • 打赏
  • 举报
回复
引用 43 楼 sdghchj 的回复:
[quote=引用 32 楼 caozhy 的回复:]
你们为什么那么多人把 lambda 写成 lamda,难道你们读这个单词不是蓝布哒,而是栏目哒?好奇怪。

b是不发音的[/quote]

查了下,还真的不发音。我的英语是数学老师教的。
闭包客 2019-02-16
  • 打赏
  • 举报
回复
当要用函数作为参数的时候,=> 是比较简便的写法,在以前的 C# 版本中,使用的是 delegate 关键字来表示匿名函数。
  • 打赏
  • 举报
回复
嗯 => 符号除了 lamda 表达式,再有可能就是表示“大于或者等于”了
threenewbee 2019-02-15
  • 打赏
  • 举报
回复
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代码就会很复杂,需要考虑到各种用户的不同排序规则,这样才能写出尽可能通用的代码,而且无论多么通用,总是有边界的,总会遇到无法满足要求的时候。
  • 打赏
  • 举报
回复
引用 5 楼 初出茅庐的孩子 的回复:
[quote=引用 1 楼 exception1992 的回复:] lambda表达式专属,action或者func委托用的最多。
借楼举个例子: 可以使用Action封装一个方法,其中“(形参)=>函数” var action = new Action<string>((string str) => { Console.WriteLine(str); });[/quote] 这就是 lamda 表达式,而不是什么“其它的表达式”。 可见你不知道 lamda 表达式用在哪些地方,可能你以为只有 linq 才用 lamda 表达式?
啊宝儿姐 2019-02-15
  • 打赏
  • 举报
回复
引用 4 楼 以专业开发人员为伍 的回复:
你先把因为自己不识 lamda 表达式而多余地产生“其它使用场景以及表达的语法意义”的找出来,这个最重要。
斑主说了是lambda表达式专属,也就是说"=>"所表达的语法已经固定了吧,那么其它的使用场景就是lambda之外的事情。
啊宝儿姐 2019-02-15
  • 打赏
  • 举报
回复
引用 1 楼 exception1992 的回复:
lambda表达式专属,action或者func委托用的最多。
借楼举个例子: 可以使用Action封装一个方法,其中“(形参)=>函数” var action = new Action<string>((string str) => { Console.WriteLine(str); });
  • 打赏
  • 举报
回复
你先把因为自己不识 lamda 表达式而多余地产生“其它使用场景以及表达的语法意义”的找出来,这个最重要。
啊宝儿姐 2019-02-15
  • 打赏
  • 举报
回复
引用 2 楼 以专业开发人员为伍 的回复:
你能真正理解 lamda 表达式都有哪些使用使用场景,就知道 => 都有那些场景了。
不吝赐教
  • 打赏
  • 举报
回复
你能真正理解 lamda 表达式都有哪些使用使用场景,就知道 => 都有那些场景了。
exception92 2019-02-15
  • 打赏
  • 举报
回复
lambda表达式专属,action或者func委托用的最多。
threenewbee 2019-02-15
  • 打赏
  • 举报
回复
引用 33 楼 圣殿骑士18 的回复:
[quote=引用 32 楼 caozhy 的回复:] 你们为什么那么多人把 lambda 写成 lamda,难道你们读这个单词不是蓝布哒,而是栏目哒?好奇怪。
我去,还没注意这事儿。因为百度上也有大量的lamda,以讹传讹,最后反而发音和拼写简单的很流行。[/quote] 所以说啊,网站千千万,百度不能看,上网用百度,亲人两行泪
圣殿骑士18 2019-02-15
  • 打赏
  • 举报
回复
引用 32 楼 caozhy 的回复:
你们为什么那么多人把 lambda 写成 lamda,难道你们读这个单词不是蓝布哒,而是栏目哒?好奇怪。

我去,还没注意这事儿。因为百度上也有大量的lamda,以讹传讹,最后反而发音和拼写简单的很流行。
加载更多回复(20)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧