将Lambda LINQ语句作为Func<>传递的问题

时间:2011-03-25 17:13:07

标签: c# .net linq lambda

我正在写一些例子来帮助我使用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;
   }

有什么想法? 理查德

5 个答案:

答案 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");

希望这能解决您的问题