Проблемы с передачей оператора Lambda LINQ как Func <> - PullRequest
2 голосов
/ 25 марта 2011

Я пишу несколько примеров, чтобы помочь мне использовать Func <> и Lambda, так как мне нужно разгадать предыдущий код разработчика в проекте, над которым я работаю, и он использует методы, с которыми я не знаком.

Итак, я написал несколько примеров увеличения сложности от запроса Simple LINQ до передачи LINQ как FUNC методу. Кажется, все в порядке.

Затем я переключился с LINQ на Lambda. Simple работает хорошо, но я не могу понять, как передать лямбду как (в?) 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 ]

2 голосов
/ 25 марта 2011

Я думаю Вы хотите:

 RunTheMethod(name => dic.Where(entry => entry.Value == name)
                         .Select(entry => entry.Key),
              "John");

но не совсем понятно ...

1 голос
/ 25 марта 2011
 Func<string, IEnumerable<int>> searchFunc = (searchValue) => dic.Where(entry => entry.Value == searchValue).Select(entry => entry.Key);

 IEnumerable<int> match6 = RunTheMethod(searchFunc, "John");

Надеюсь, что это решит вашу проблему

1 голос
/ 25 марта 2011

Вам нужно поместить туда лямбда-выражение, которое соответствует: Func<string, IEnumerable<int>>.Принимает String и возвращает IEnumerable<int>.Это может быть что угодно.Например:

S => S.Chars("T").Select(C => C.Length) 

... будет действительным.Это вернуло бы IEnumerable длины каждой строки, если бы данная строка была разбита на более мелкие строки, обозначенные символом T .

Не то, что вы, вероятно, хотите сделать, просто пример.Я предполагаю, что вы не хотите решать свою проблему таким образом , но это тот тип вещей, который должен быть в том месте, которое вы указали.Любое лямбда-выражение, в котором String превращается в IEnumerable<T>

1 голос
/ 25 марта 2011

В вашем коде match4 это не лямбда, это просто IEnumerable<int>. Я думаю, вы хотите что-то вроде

var selector = searchName => dic.Where(entry => entry.Value == searchName)
                                .Select(entry => entry.Key);
var ints = selector("John");
1 голос
/ 25 марта 2011

Пример анонимного делегата:

 IEnumerable<int> match6 = RunTheMethod((name) => 
{ 
     //do something with name 
     return new List<int>(); 
}, "John"); 

Ваш тип Func<string, IEnumerable<int>> означает, что он ожидает делегата метода, который принимает строку для первого параметра и возвращает IEnumerable<int>

в синтаксисе (name) => {} имя является именем аргумента и может быть доступно внутри фигурных скобок {}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...