一个人可以写一个方法来利用Lambda表达式吗?

本文关键字:Lambda 表达式 方法 一个 一个人 | 更新日期: 2023-09-27 17:54:11

我以前从未使用过Lambda表达式,希望能够编写自己的方法,可以使用Lambda表达式。有办法做到这一点,如果有,为什么我的方法不工作下面。

问题:我的testString方法可以像我的p.p zip示例一样使用lambda表达式吗?

代码:

    public void testString(string a, string b)
    {
        Console.WriteLine("A: " + a + "B: " + b);
    }
    static void Main(string[] args)
    {
        string[] p = { "A", "B", "C", "D" };
        string[] s = { "AA-A", "BB-B", "CC-C", "DD-D" };
        var statesWithCodes = p.Zip(s, (c, ss) => c + ": " + ss); //lambda expressions
        foreach (var v in statesWithCodes)
        {
             Console.WriteLine(v);
        }

—这是我不确定为什么不使用lambda表达式甚至

的代码

如果它应该能够工作

        string temp1 = "a";
        string temp2 = "b";
        testString((temp1,temp2) => temp1 + " -- " + temp2);

添加了新代码,以便我可以查看是否可以从下面的答案中调用委托函数。它的一部分工作,但如果我想有几个函数满足委托参数列表。

类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DDHTestDelegate
{
    class Program
    {
        // declare a delegate that takes in two strings and returns a string:
        delegate string StringDelegate(string inputString, string baseString);
        public void someFunction(string a, string b)
        {
            Console.WriteLine("String a: " + a);
            Console.WriteLine("String a: " + b);
        }
        // this calls the delegate function
        static string Test(StringDelegate theFunction, string inputString1, string inputString2)
        {
            return theFunction(inputString1, inputString2);
        }

        static void Main(string[] args)
        {
            Console.WriteLine(Test((input1, input2) => input1 + ": " + input2, "S1", "S2"));
            Console.ReadKey();
        }
    }
}

我认为这是让我感到困惑的部分,而这正是我现在想要做的。

   (input1, input2) => input1 + ": " + input2    

这段代码是如何用StringDelegate在Test函数中使用的,因为该函数只返回。这将编译和运行,但我不完全确定为什么它是这样工作的。

更多的代码:

         Console.WriteLine(Test(someFunction("w","i")), 
                          "S1", 
                          "S2");

为什么这个代码也不能工作?Test函数接受三个参数。一个函数,另外两个字符串。为什么这会引起问题。

其他的例子:

    static public void testString(Func<string, string, string> function)
    {
       temp1 = "a";
       temp2 = "b";
       Console.WriteLine(function(a, b));
    }
    testString((temp1, temp2) => temp1 + " -- " + temp2);

上面的例子也不能完全工作。

错误列表:

Error   1   The name 'temp1' does not exist in the current context  C:'Users'itpr13266'AppData'Local'Temporary Projects'DDHTestDelegate'Program.cs  27  12  DDHTestDelegate
Error   2   The name 'temp2' does not exist in the current context  C:'Users'itpr13266'AppData'Local'Temporary Projects'DDHTestDelegate'Program.cs  28  12  DDHTestDelegate
Error   3   The name 'a' does not exist in the current context  C:'Users'itpr13266'AppData'Local'Temporary Projects'DDHTestDelegate'Program.cs  29  39  DDHTestDelegate
Error   4   The name 'b' does not exist in the current context  C:'Users'itpr13266'AppData'Local'Temporary Projects'DDHTestDelegate'Program.cs  29  42  DDHTestDelegate

一个人可以写一个方法来利用Lambda表达式吗?

您可以使用lambda(或一般的委托)作为方法参数。最简单的方法是使用Action<>Func<>类型。

public void testString(Func<string, string, string> function)
{
    temp1 = "a";
    temp2 = "b";
    Console.WriteLine(function(a, b));
}

现在,你可以这样调用它:

testString((temp1,temp2) => temp1 + " -- " + temp2);

这并不总是像Marcin发布的那样容易编写,但你可以显式地声明一个委托,如:

// declare a delegate that takes in two strings and returns a string:
delegate string StringDelegate(string inputString, string baseString);

然后定义使用此委托的函数:

// this calls the delegate function
static string Test(StringDelegate theFunction, string inputString1, string inputString2)
{
    return theFunction(inputString1, inputString2);
}

最后,您可以将其与lambda一起使用,如:

Console.WriteLine(Test((input1, input2) => input1 + ": " + input2, "S1", "S2"));

再次,也许不完全像Func选项那样简单,但如果您想将您的委托与使用这些委托的函数分开定义,它可能会很有用。