任何人都可以向我解释这行在c#中的作用吗?

时间:2016-03-29 20:33:00

标签: c# properties expression

我不理解<...>语法,这是函数吗? 有人能解释一下这行代码吗?

ApplyPropertyChange<AgreementTransaction, int>(ref _agreementId, o => o.AgreementId, value);

3 个答案:

答案 0 :(得分:1)

此语法:

o => o.AgreementId

是使用lambda operator

具体来说,这会创建一个匿名函数,该函数接受一个名为o的参数,而且正文只是return o.AgreementId

所以这个:

o => o.AgreementId

是这方面的简写:

delegate(var o)
{
    return o.AgreementId;
}

然而,您无法真正指定var o,但对于lambda运算符,编译器可根据函数所适用的委托推断o的正确类型,并且是你需要转到ApplyPropertyChange方法的地方,很可能看起来像这样:

public void ApplyPropertyChange<T1,T2>(ref T2 value, Func<T1,T2> getValue, T1 inputValue)

在这种情况下,T1T2是从o.AgreementIdref _agreementId推断的。

答案 1 :(得分:1)

基于方法(<>)的命名和参数类型,它看起来像是一组元素中元素的setter。 AgreementTransaction用法是传递元素的类型,在这种情况下它是int;类型Func的第二个参数很可能是期望值或foreach(AgreementTransaction el in setOfElements) { if( (int)el.AgreementId == _agreementId ) { el.AgreementId = value; } } 的结果。

  

ApplyPropertyChange(ref _agreementId,o =&gt; o.AgreementId,value);

看起来它正在获取元素集,通过使用其AgreementId在集合中查找元素,然后设置显示的值。

在某种程度上,它可以在基本层面上重写。

Func<>

传入的AgreementTransaction称为谓词。它本质上是一个将AgreementTransactions.Select( o => o.AgreementId ); 投影到int中的委托。

这样想:

List<AgreementTransaction> AgreementTransactions = someListOfThem;
List<int> result = new List<int>();
foreach(AgreementTransaction agree in AgreementTransactions)
{
    result.Add(agree.AgreementId);
}

或更广泛的例子:

{{1}}

总的来说,还有很多事情我不会涉及Lambda表达式,Func声明和委托。您可以从MSDN上阅读更多内容:https://msdn.microsoft.com/en-us/library/bb397687.aspx

答案 2 :(得分:1)

=&GT;是lambda运算符。有人说你发音为&#34;进入&#34;。这是代表的捷径。

也许上面的句子为你提供了几个新的概念。代表背后的想法是,您不能将值作为函数的参数,而是函数。实际上参数是一个值,但该值不是整数或对象;它是一种功能类型。

如果你调用像 F(x)这样的函数而你给了一个值4作为参数,你就会告诉这个函数,只要它看到字母X,就应该使用价值4。

代表也是如此。如果你有一个带有委托D作为参数的函数,你用参数Sin(x)调用它,你会告诉函数,只要它使用对D的调用就应该调用Sin(x)。

使用委托的传统方式涉及一些打字。随着lambda表达式的引入,这变得更加容易。

lambda表达式在Linq中大量使用。无论什么时候你需要用数组/列表/集合/集等序列来做事,你通常会使用foreach Linq将使你的生活更轻松。

例如,我们假设您有一系列人员。我在这里使用术语序列,因为我不关心它是一个数组,一个列表,一个集合,一个集合,等等。我要求的唯一想法是,我可以要求第一个元素和序列中的下一个元素,直到没有更多的元素。简而言之:我要求序列是可枚举的。

假设从这个序列中我只想要具有FirstName属性值的人员#34; John&#34;。为此,使用静态函数Enumerable.Where。结果是一个与我原始序列相同类型的IEnumerable:

IEnumerable<Person> personsNamedJohn = Persons
    .Where(p => p.FirstName == "John");

在这里,您将看到=&gt;。您可以将其标记为:

从序列人员中,取每个人(让我们称之为p),其中p.FirstName ==&#34; John&#34;。

我经常通过给我的序列一个复数标识符(人)来保持它的可读性,而不是p我写单数标识符:

IEnumerable<Person> personsNamedJohn = Persons
    .Where(person => person.FirstName == "John");
IEnumerable<Shape> circles = Shapes
    .Where(shape => shape.ShapeType == Shape.Circle);

你使用lambda还有很多其他Linq函数。我们看到函数where给出了与谓词匹配的序列元素。函数Select将使用序列中的每个项目来创建另一个项目。

IEnumerable<Address> addressesOfPersonsNamedJohn = Persons
    .Where(person => person.FirstName == "John")
    .Select(person => new Address(person.Street, person.City, person.ZIP));

这是:来自所有人,只接受名字为&#34; John&#34;的人,并且从这些人中的每一个人获取Street,City和ZIP属性作为Address对象的构造函数的参数。结果是一系列地址。

一开始我发现lambda运算符的使用相当混乱,但是一旦我理解了它,它变得非常有用。每当我写foreach时,我发现如果我使用带有lambda表达式的Linq语句,它通常可以写得更短更容易理解。

The standard linq operatores是我了解linq,delegates和lambda

的一个很好的起点