121 votes

C# Passer une expression lambda comme paramètre de méthode

J'ai une expression lambda que j'aimerais pouvoir faire circuler et réutiliser. Voici le code :

public List<IJob> getJobs(/* i want to pass the lambda expr in here */) {
  using (SqlConnection connection = new SqlConnection(getConnectionString())) {
    connection.Open();
    return connection.Query<FullTimeJob, Student, FullTimeJob>(sql, 
      (job, student) => {         
        job.Student = student;
        job.StudentId = student.Id;
        return job;
        },
        splitOn: "user_id",
        param: parameters).ToList<IJob>();   
  }   

La clé ici, c'est que je veux pouvoir passer l'expression lambda que j'utilise ici dans la méthode qui appelle ce code, afin de pouvoir la réutiliser. L'expression lambda est le deuxième argument dans ma méthode .Query. Je suppose que je devrais utiliser une Action ou un Func, mais je ne suis pas tout à fait sûr de la syntaxe de cette expression ou de son fonctionnement. Quelqu'un peut-il me donner un exemple ?

138voto

Oded Points 271275

Utilisez un Func<T1, T2, TResult> en tant que type de paramètre et le passer à votre Query :

public List<IJob> getJobs(Func<FullTimeJob, Student, FullTimeJob> lambda)
{
  using (SqlConnection connection = new SqlConnection(getConnectionString())) {
    connection.Open();
    return connection.Query<FullTimeJob, Student, FullTimeJob>(sql, 
        lambda,
        splitOn: "user_id",
        param: parameters).ToList<IJob>();   
  }  
}

Vous l'appelleriez :

getJobs((job, student) => {         
        job.Student = student;
        job.StudentId = student.Id;
        return job;
        });

Ou assigner le lambda à une variable et passer it dans.

33voto

Marinpietri Points 92

Si je comprends bien, vous avez besoin du code suivant. (en passant l'expression lambda par paramètre) La méthode

public static void Method(Expression<Func<int, bool>> predicate) { 
    int[] number={1,2,3,4,5,6,7,8,9,10};
    var newList = from x in number
                  .Where(predicate.Compile()) //here compile your clausuly
                  select x;
                newList.ToList();//return a new list
    }

Méthode d'appel

Method(v => v.Equals(1));

Vous pouvez faire la même chose dans leur classe, voir cet exemple.

public string Name {get;set;}

public static List<Class> GetList(Expression<Func<Class, bool>> predicate)
    {
        List<Class> c = new List<Class>();
        c.Add(new Class("name1"));
        c.Add(new Class("name2"));

        var f = from g in c.
                Where (predicate.Compile())
                select g;
        f.ToList();

       return f;
    }

Méthode d'appel

Class.GetList(c=>c.Name=="yourname");

J'espère que cela vous sera utile

10voto

SztupY Points 4586

Les expressions lambda ont un type Action<parameters> (dans le cas où ils ne renvoient pas de valeur) ou Func<parameters,return> (dans le cas où ils ont une valeur de retour). Dans votre cas, vous avez deux paramètres d'entrée, et vous devez retourner une valeur, donc vous devez utiliser :

Func<FullTimeJob, Student, FullTimeJob>

5voto

devdigital Points 22495

Vous devez utiliser un type de délégué et le spécifier comme paramètre de la commande. Vous pouvez utiliser l'un des types de délégués intégrés, à savoir - Action y Func .

Dans votre cas, il semble que votre délégué prenne deux paramètres, et renvoie un résultat, donc vous pourriez utiliser Func :

List<IJob> GetJobs(Func<FullTimeJob, Student, FullTimeJob> projection)

Vous pourriez alors appeler votre GetJobs en passant dans une instance de délégué. Cela peut être une méthode qui correspond à cette signature, un délégué anonyme ou une expression lambda.

P.S. Vous devez utiliser le PascalCase pour les noms de méthodes - GetJobs pas getJobs .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X