我已经快速阅读了Microsoft Lambda表达式文档。

不过,这样的例子帮助我更好地理解:

delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate(5); //j = 25

不过,我还是不明白为什么这是一种创新。它只是一个在“方法变量”结束时死亡的方法,对吧?为什么我要用这个而不是真正的方法?


当前回答

例如,Lambda表达式使任务简单得多

var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var oddNumbers = numbers.Where(x => x % 2 != 0);
var sumOfEven = numbers.Where(x => x % 2 == 0).Sum();

在上面的代码中,因为我们使用了lambda,所以我们在一行代码中得到奇数和偶数的和。

如果没有lambda,我们将不得不使用if/else或for循环。

因此,使用lambda来简化c#中的代码是很好的。

一些关于它的文章:

https://qawithexperts.com/article/c-sharp/lambda-expression-in-c-with-examples/470

https://exceptionnotfound.net/csharp-in-simple-terms-18-expressions-lambdas-and-delegates

http://dontcodetired.com/blog/post/Whats-New-in-C-10-Easier-Lambda-Expressions

其他回答

匿名函数和表达式对于一次性方法非常有用,这些方法不需要从创建完整方法所需的额外工作中获益。

想想这个例子:

 List<string> people = new List<string> { "name1", "name2", "joe", "another name", "etc" };
 string person = people.Find(person => person.Contains("Joe"));

 public string FindPerson(string nameContains, List<string> persons)
 {
     foreach (string person in persons)
         if (person.Contains(nameContains))
             return person;
     return null;
 }

它们在功能上是等价的。

创新在于类型的安全性和透明度。虽然您没有声明lambda表达式的类型,但它们是推断出来的,并且可以由代码搜索、静态分析、重构工具和运行时反射使用。

例如,在您使用SQL之前,可能会受到SQL注入攻击,因为黑客在通常需要数字的地方传递了一个字符串。现在您将使用LINQ lambda表达式,这是受保护的。

在纯委托上构建LINQ API是不可能的,因为它需要在计算表达式树之前将它们组合在一起。

2016年,大多数流行语言都支持lambda表达式,c#是主流命令式语言中这一演变的先驱之一。

这样可以避免在远离使用方法的地方定义只在特定位置使用一次的方法。好的用途是作为泛型算法(如排序)的比较器,然后您可以定义一个自定义排序函数,在该函数中调用排序,而不是进一步迫使您查看其他地方以查看您正在排序的对象。

这并不是真正的创新。LISP拥有lambda函数已经有30年或更长时间了。

您还可以在编写作用于方法的泛型代码时使用lambda表达式。

例如:计算方法调用所花费的时间的泛型函数。(即这里的动作)

public static long Measure(Action action)
{
    Stopwatch sw = new Stopwatch();
    sw.Start();
    action();
    sw.Stop();
    return sw.ElapsedMilliseconds;
}

你可以使用lambda表达式调用上述方法,如下所示,

var timeTaken = Measure(() => yourMethod(param));

表达式允许您从方法和out参数中获取返回值

var timeTaken = Measure(() => returnValue = yourMethod(param, out outParam));

Microsoft has given us a cleaner, more convenient way of creating anonymous delegates called Lambda expressions. However, there is not a lot of attention being paid to the expressions portion of this statement. Microsoft released a entire namespace, System.Linq.Expressions, which contains classes to create expression trees based on lambda expressions. Expression trees are made up of objects that represent logic. For example, x = y + z is an expression that might be part of an expression tree in .Net. Consider the following (simple) example:

using System;
using System.Linq;
using System.Linq.Expressions;


namespace ExpressionTreeThingy
{
    class Program
    {
        static void Main(string[] args)
        {
            Expression<Func<int, int>> expr = (x) => x + 1; //this is not a delegate, but an object
            var del = expr.Compile(); //compiles the object to a CLR delegate, at runtime
            Console.WriteLine(del(5)); //we are just invoking a delegate at this point
            Console.ReadKey();
        }
    }
}

This example is trivial. And I am sure you are thinking, "This is useless as I could have directly created the delegate instead of creating an expression and compiling it at runtime". And you would be right. But this provides the foundation for expression trees. There are a number of expressions available in the Expressions namespaces, and you can build your own. I think you can see that this might be useful when you don't know exactly what the algorithm should be at design or compile time. I saw an example somewhere for using this to write a scientific calculator. You could also use it for Bayesian systems, or for genetic programming (AI). A few times in my career I have had to write Excel-like functionality that allowed users to enter simple expressions (addition, subtrations, etc) to operate on available data. In pre-.Net 3.5 I have had to resort to some scripting language external to C#, or had to use the code-emitting functionality in reflection to create .Net code on the fly. Now I would use expression trees.