我正在写一些例子来帮助我使用Func<>和Lambda一样,我需要在我正在进行的项目中解开以前的开发人员代码,并且他使用了我不熟悉的技术。
所以我编写了一些从简单LINQ查询增加复杂性到将LINQ作为FUNC传递给方法的示例。一切似乎都没问题。
然后我从LINQ切换到Lambda。简单的工作还可以,但我无法弄清楚如何将Lambda作为(in?)传递给Func<>。
我的代码如下。我已经标记了我被困在WHAT_GOES_HERE
的位置private void some method()
{
Dictionary<int,string> dic = new Dictionary<int,string>();
//Set the data into the dictionary
dic.Add(1, "Mathew");
dic.Add(2, "Mark");
dic.Add(3, "Luke");
dic.Add(4, "John");
dic.Add(5, "John");
#region Simple LINQ as Lambda
string searchName = "John";
var match4 = dic.Where(entry => entry.Value == searchName).Select(entry => entry.Key);
//Get the data out of the return from the query
foreach (int result in match4)
{
int keyValue = result;
}
#endregion
#region Passing the Simple LINQ as Lambda as a Func<>
//uses the above Lambda - This works although the name used is the value of searchName
IEnumerable<int> match5 = RunTheMethod(deligateName => match4, "John");
//I want to have an inline Lambda as the first parameter
IEnumerable<int> match6 = RunTheMethod(WHAT_GOES_HERE?, "John");
foreach (int result in match6)
{
int keyValue = result;
}
#endregion
}
public IEnumerable<int> RunTheMethod(Func<string, IEnumerable<int>> myMethodName, string name)
{
IEnumerable<int> i = myMethodName(name);
return i;
}
有什么想法? 理查德
答案 0 :(得分:2)
我想你想要:
RunTheMethod(name => dic.Where(entry => entry.Value == name)
.Select(entry => entry.Key),
"John");
但它并不完全清楚......
答案 1 :(得分:1)
匿名代表示例:
IEnumerable<int> match6 = RunTheMethod((name) =>
{
//do something with name
return new List<int>();
}, "John");
您的Func<string, IEnumerable<int>>
类型意味着它希望委托给第一个参数带有字符串的方法,并返回IEnumerable<int>
(name) => {}
中的是参数名称,可以在大括号{}内访问。
答案 2 :(得分:1)
在您的代码中,match4
不是lambda,只是IEnumerable<int>
。我想你想要像
var selector = searchName => dic.Where(entry => entry.Value == searchName)
.Select(entry => entry.Key);
var ints = selector("John");
答案 3 :(得分:1)
你需要在那里放一个匹配的Func<string, IEnumerable<int>>
lambda表达式。取String
,并返回IEnumerable<int>
。它可能是任何东西。例如:
S => S.Chars("T").Select(C => C.Length)
......会有效。如果给定的字符串被拆分为由 T 字符描绘的较小字符串,则返回每个字符串长度的IEnumerable。
不是你想要做的,只是一个例子。我的猜测是你不想以这种方式解决你的问题,但这是需要在你指出的地点进行的事情。任何lambda表达式,其中String
变为IEnumerable<T>
答案 4 :(得分:1)
Func<string, IEnumerable<int>> searchFunc = (searchValue) => dic.Where(entry => entry.Value == searchValue).Select(entry => entry.Key);
IEnumerable<int> match6 = RunTheMethod(searchFunc, "John");
希望这能解决您的问题