Есть ли способ передать лямбда-выражение в качестве переменной или аргумента? - PullRequest
14 голосов
/ 30 января 2012

Мне нужно передать лямбда-запрос в качестве параметра, следующий код является примером, и мне интересно найти реализацию для него, есть примеры: что-то вроде этого:

var expr1 = Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n);
var expr2 = TakeWhile((n, index) => n >= index));

And UseВот так:

public void UseLambda<T> (IEnumerable<T> source , lambda Expr){

var items= Expr.Compile(source);

foreach(var item in items)
     Console.Writeline(item.ToString());
}

public void Main(){
    List<int> numbers = new List<int> { 10, 24, 9, 87, 193, 12, 7, 2, -45, -2, 9 };
    var expr1 = Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n);
    UseLambda(numbers, expr1);
}

Кто-нибудь имеет представление об этом?

Ответы [ 5 ]

8 голосов
/ 30 января 2012

Если вы определите свои выражения LINQ следующим образом:

Func<IEnumerable<int>, IEnumerable<int>> expr1 =
               l => l.Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n);

Func<IEnumerable<int>, IEnumerable<int>> expr2 = 
               l => l.TakeWhile((n, index) => n >= index);

А ваш метод UseLambda будет иметь вид:

public void UseLambda<T> (IEnumerable<T> source 
                          ,Func<IEnumerable<T>, IEnumerable<T>> lambda)
{
    var items= lambda(source);

    foreach(var item in items)
       Console.Writeline(item.ToString());
    }
}

Тогда вы, я думаю, получите то, что ищете.

8 голосов
/ 30 января 2012

Проверка Функциональный (Of T, TResult) Делегат (MSDN)

using System;

public class LambdaExpression
{
   public static void Main()
   {
       Func<string, string> convert = s => s.ToUpper();

       string name = "Dakota";
       Console.WriteLine(convert(name));   
   }
}

Из MSDN

Базовый тип лямбда-выражения - одиниз общих Func делегатов.Это позволяет передавать лямбда-выражение в качестве параметра без явного присвоения его делегату .В частности, поскольку многие методы типов в пространстве имен System.Linq имеют параметры Func (Of T, TResult) , вы можете передать этим методам лямбда-выражение без явного создания экземпляра Func (Of T,TResult) делегат.

РЕДАКТИРОВАТЬ

Возможное решение для вашего случая

static void Main(string[] args) 
{
    List<int> numbers = new List<int> { 10, 24, 9, 87, 193, 12, 7, 2, -45, -2, 9 };
    Func<IEnumerable<int>, IEnumerable<int>> expr = n => n.Where(n1 => n1 > 6).OrderBy(n1 => n1 % 2 == 0).Select(n1 => n1);
    UseLambda<int>(numbers, expr);
}
private static void UseLambda<T>(List<T> numbers, 
                                 Func<IEnumerable<T>, 
                                 IEnumerable<T>> expr) 
{
    var values = expr(numbers);
    foreach (var item in values) {
       Console.WriteLine(item);
    }
}
1 голос
/ 30 января 2012

Вы имеете в виду что-то вроде этого:

public void UseLambda<T> (IEnumerable<T> source , Func<T, bool> where, Func<T, bool> order)
{
    if(source != null)
    {
        IOrderedEnumerable<T> orderBy = source.Where(where).OrderBy(order);
        foreach (T value in orderBy)
        {
            Console.WriteLine(value);
        }
    }
}

Чтобы вы могли назвать это так:

UseLambda(numbers, x => x > 6, x => x % 2 == 0);
0 голосов
/ 30 января 2012
public void UseLambda<T>(IEnumerable<T> source, Expression<Func<IEnumerable<T>, IEnumerable<T>>> expr)
{
    var items = expr.Compile();

    foreach (var item in items.Invoke(source))
    {
        Console.WriteLine(item.ToString());
    }
}


public void Main()
{
    Expression<Func<IEnumerable<int>, IEnumerable<int>>> expr = s => s.Where(n => n > 6).OrderBy(n => n % 2 == 0).Select(n => n);
    var list = new List<int> { 10, 24, 9, 87, 193, 12, 7, 2, -45, -2, 9 };

    UseLambda(list, expr);
}
0 голосов
/ 30 января 2012

Что ж, лямбда - это не что иное, как делегат, поэтому у вас может быть такой метод:

public void DoIt(IEnumerable a, Action<IEnumerable> performThis)
{
  performThis(a);
}

Но какой в ​​этом смысл? Вместо того, чтобы вызывать метод, который применяет вашу лямбду, почему бы не вызвать его напрямую, как вы делаете в последних строках вашего кода?

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