在定义后立即执行lambda表达式?

时间:2012-04-17 20:09:53

标签: c# lambda

有没有办法在定义后立即执行lambda表达式?

换句话说(无效的C#代码):

(() => { Console.WriteLine("Hello World"); }).Invoke();

6 个答案:

答案 0 :(得分:40)

不确定。

new Action(() => { Console.WriteLine("Hello World"); })();

这应该可以解决问题。

答案 1 :(得分:17)

另一个“选项”,其他两个答案只是略有不同:

((Action)(() => { Console.WriteLine("Hello World"); }))();

原因,直接取自phoog的评论

  

...您还没有告诉编译器您是想要Action还是Expression<Action>。如果该lambda表达式转换为Action,您将能够在其上调用Invoke或使用方法调用语法()来调用它。

虽然确实很难看,而且我不知道这个表格有用的地方,因为它不能用于没有名字的递归......

答案 2 :(得分:3)

你应该可以这样做:

Action runMe = () => { Console.WriteLine("Hello World"); };
runMe();

答案 3 :(得分:2)

以下是如何使用此示例的示例。您希望使用几行代码的结果初始化构造函数,这些代码不能作为函数编写,因为这是第三方API的结构。

它只是胶水代码,以防止编写一个永远不会在其他地方调用的独立函数。我使用Func代替Action,但答案与user166390相同。

        // imagine several dozens of lines that look like this
        // where the result is the return value of a function call
        fields.Add(new ProbeField(){ 
            Command = "A",
            Field = "Average",
            Value = be.GetAverage()
        });

        // now you need something that can't be expressed as function call
        // so you wrap it in a lambda and immediately call it.
        fields.Add(new ProbeField(){ 
            Command = "C",
            Field = "Cal Coeff",
            Value = ((Func<string>)(() => {
                CalCoef coef;
                Param param;
                be.GetCalibrationCoefficients(out coef, out param);
                return coef.lowDet1.ToString();
            }))()
        });

答案 4 :(得分:2)

对于我自己的项目,有时我写了一个很小的可重用的辅助函数,以使立即调用的lambda的语法看起来更短。此“ Inv”的灵感来自LanguageExt库中类似的“有趣”功能。

// Helper utility functions
public static void Inv(Action a) => a();
public static T Inv<T>(Func<T> f) => f();

private static void TestMethod()
{
    // Action example
    Inv(() => Console.WriteLine("Hello World!"));
    // Func example with no parameters
    bool result = Inv(() =>
    {
        if (1 == 1)
            return true;
        else
            return false;
    });
}

您还可以使用其他一些重载对其进行扩展,以使您可以传递参数,但是这些语法在语法上看起来更加麻烦,可能没有帮助。

public static Func<A, T> Inv<A, T>(Func<A, T> f) => f;
public static Func<A, B, T> Inv<A, B, T>(Func<A, B, T> f) => f;

string printNumber = Inv((int number) => $"This is the number {number}")(5);
int addedNumbers = Inv((int x, int y) => x + y)(5, 6);

答案 5 :(得分:1)

using System.Threading.Tasks;
using System.Threading;

Task.Run(()=>{
     //do something
});

程序员真的很喜欢让事情变得比他们应该做的更难

您可以添加 500 毫秒的延迟

Task.Run(()=>{
    Thread.Sleep(500);
    //do something
});

然后下一个逻辑扩展是将参数传递给您的匿名函数。您可以使用范围执行此操作:

var x=1;
Task.Run(()=>{
    x++;
});

然后你基本上可以把 C# 的其余部分扔到窗外。如果你喜欢这种函数式风格,我建议使用 JS 或 C。