一个人可以写一个方法来利用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(或一般的委托)作为方法参数。最简单的方法是使用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
选项那样简单,但如果您想将您的委托与使用这些委托的函数分开定义,它可能会很有用。