C# =>操作符做什么?

C# =>操作符做什么?,c#,asp.net,lambda,C#,Asp.net,Lambda,我正在学习C/ASP.NET教程,遇到了一个从未见过的操作员 return RSVPs.Any(r => r.AttendeeName.Equals(userName, StringComparison.InvariantCultureIgnoreCase)); =>在这行代码中是什么意思???这是定义lambda表达式的语法。它本质上是C中委托/匿名方法的缩写 Func<int,int> add2 = x => x + 2; int value = add2(42);

我正在学习C/ASP.NET教程,遇到了一个从未见过的操作员

return RSVPs.Any(r => r.AttendeeName.Equals(userName, StringComparison.InvariantCultureIgnoreCase));

=>在这行代码中是什么意思???

这是定义lambda表达式的语法。它本质上是C中委托/匿名方法的缩写

Func<int,int> add2 = x => x + 2;
int value = add2(42); // value == 44
在此特定示例中,它定义了一个委托,该委托接受一个RSVP实例,如果AttendeName值等于传入的用户名,则返回true。如果传入的委托对于集合中的任何值都为true,则Any扩展方法返回true

这里是一个扩展的方式写你张贴的样本

Func<RSPV,bool> del = r => r.AttendeeName.Equals(userName, StringComparison.InvariantCultureIgnoreCase);
return RSVPS.Any(del);
=>是lambda表达式的一部分,将其左侧的参数与其右侧的表达式/语句相关联。根据其使用方式,它可以表示匿名委托:

return RSVPs.Any(delegate (RSVP r) { r.AttendeeName.Equals(userName, StringComparison.InvariantCultureIgnoreCase) });
或等效表达式树:

Expression<Func<RSVP, bool>> e = r => r.AttendeeName.Equals(userName, StringComparison.InvariantCultureIgnoreCase);

所有lambda表达式都使用lambda运算符=>,该运算符的读取方式为转到。lambda运算符的左侧指定输入参数(如果有),右侧保存表达式或语句块。lambda表达式x=>x*x被读取x乘以x。可以按如下方式将此表达式指定给委托类型:

delegate int del(int i);
static void Main(string[] args)
{
    del myDelegate = x => x * x;
    int j = myDelegate(5); //j = 25
}
它定义了一个

相当于

delegate( RSVP r ) { return r.AttendeeName.Equals(userName, StringComparison.InvariantCultureIgnoreCase); }

这是一个lambda表达式。在您给出的示例中,r是列表中的一项。此代码将迭代您的列表[RSVPs],查找与会者姓名与用户名中的任何内容相同的r

为了理解发生了什么,您需要理解委托,但本质上Coles Notes版本是=>r左侧的参数在本例中是列表[RSVPs]中的一个项,该项正在按顺序迭代,对于r的每个实例,您都在检查某些内容。从用户的角度来看,这大致相当于:

public bool HasRSVP(List<RSVP> RSVPs, string userName)
{
    foreach(RSVP r in RSVPs)
        if(r.AttendeeName.Equals(userName, StringComparison.InvariantCulture))
            return true;
    return false;
}

有没有什么原因比foreach循环在找到匹配项后退出更好?我用它来提高代码的可读性?速度?如果OP只是遇到=>那么也许你的Func也需要一些解释。我一直在使用lambda,但我必须承认,当我开始看到Funcs被引入时,我开始感到慌乱。是否有理由使用lambda表达式而不是您提供的代码。无论如何,对我来说,你的代码更容易阅读。不可否认,对于一个不熟悉lambda表达式和delgates的用户来说,我的代码似乎更容易阅读。但是,一旦你习惯了使用委托和lambda表达式,它们会及时出现,你会惊讶地发现lambda表达式实际上变得更直观,因此比正手版本更容易阅读。我不知道你是否有任何数据库经验,但这就像说:return exists从RSVPs中选择r,其中r.attendename=@userName;Lambda表达式使您能够在更少的代码中更具表现力。@Daniel Auger-我同意,您编写的代码行越少,引入的bug就越少。它们肯定会减少代码的总行数。此外,可以认为,使用lambdas和经过验证/可靠的扩展方法可能比长期使用更不容易出错。它们一开始看起来确实很奇怪,但很快就变成了第二天性。我认为goes to在示例的上下文中有点误导,它更像是SQL Select ListItem,其中ListItem.AttendeName=UserName使用MSDN,因为我只是从文档中复制和粘贴了它它在stackoverflow中重复:
delegate( RSVP r ) { return r.AttendeeName.Equals(userName, StringComparison.InvariantCultureIgnoreCase); }
public bool HasRSVP(List<RSVP> RSVPs, string userName)
{
    foreach(RSVP r in RSVPs)
        if(r.AttendeeName.Equals(userName, StringComparison.InvariantCulture))
            return true;
    return false;
}