理解C#Lambda表达式

时间:2015-12-05 02:08:46

标签: c# lambda

我已经google了很多东西来理解c#中的lambda表达式。虽然人们提供了一些信息,但我无法理解它是什么。任何人都可以用以下代码解释我。这段代码可以让我理解,因为它是“我的”上下文。

context.Authors.AddOrUpdate(x => x.Id,
    new Author() { Id = 1, Name = "Jane Austen" },
    new Author() { Id = 2, Name = "Charles Dickens" },
    new Author() { Id = 3, Name = "Miguel de Cervantes" }
    );

为什么不是“x => x”?

3 个答案:

答案 0 :(得分:3)

x => x 

的简写
x => {
    return x;
}

这是一个将x作为参数并返回x的函数,而

x => x.Id

的简写
x => {
    return x.Id;
}

这基本上意味着AddOrUpdate函数需要知道如何获取它正在添加或更新的实体的Id,你可以将lambda视为一种定义函数的紧凑方式,在大多数情况下你可以实际定义功能:

int GetAuthorId(Author x) {
    return x.Id;
}

并使用该函数代替lambda:

context.Authors.AddOrUpdate(GetAuthorId,
    new Author() { Id = 1, Name = "Jane Austen" },
    new Author() { Id = 2, Name = "Charles Dickens" },
    new Author() { Id = 3, Name = "Miguel de Cervantes" }
);

在AddOrUpdate函数内部,只要想要查找作者ID,它就会运行GetAuthorId并将作为参数传递给参数

- 编辑 -

正如评论中正确指出的那样,我刚才所说的Func<>是正确的,但对于Expression<Func<>>则不然,你可以阅读一些关于差异的here

答案 1 :(得分:1)

简单地说,因为该方法期望接收表示Authors的语义键的表达式。

这样想 - 如果你传入x => x,你会尝试执行以下操作:

  1. 基于对象Author
  2. 指定的密钥
  3. 添加或更新给定的Author个对象。
  4. 当你传递x => x.Id时,你会说:

    1. 基于对象Author.Id
    2. 指定的密钥
    3. 添加或更新给定的Author对象。
    4. 要了解原因,可能会帮助您注意该方法需要Expression<Func<TEntity,Object>>。此参数类型通常用于对任意属性执行操作,如此处AddOrUpdate正在执行此操作。

      这里的方法示例将采用表达式并打印出属性的成员名称。这里有更多的权力,但这应该至少有助于解释为什么AddOrUpdate()接受它所做的参数。

      class Person
      {
          public string FirstName { get; set; }
          public string LastName { get; set; }
      }
      
      static void Example<T>(Expression<Func<T, object>> identifierExpression)
      {
          MemberExpression prop = identifierExpression.Body as MemberExpression;
          Console.WriteLine(prop.Member);
      }
      
      static void Main(string[] args)
      {
          var person = new Person { FirstName = "jd", LastName = "phenix" };
          Example<Person>(x => x.FirstName);
      }
      

答案 2 :(得分:0)

Why it is not "x=>x"

因为函数有时需要唯一地标识每个对象。在这种情况下,对象的 ID

如果ID存在,则执行更新。如果ID不存在,则执行插入。