web-dev-qa-db-fra.com

Expression Lambda C # Pass en tant que 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 est que je veux pouvoir passer l'expression lambda que j'utilise ici dans la méthode qui appelle ce code afin que je puisse le réutiliser. L'expression lambda est le deuxième argument de ma méthode .Query. Je suppose que je voudrais utiliser une Action ou un Func, mais je ne suis pas sûr de la syntaxe de ce script ni de son fonctionnement. Quelqu'un peut-il s'il vous plaît me donner un exemple?

94
Adam Levitt

Utilisez un délégué Func<T1, T2, TResult> comme type de paramètre et transmettez-le à 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 assignez le lambda à une variable et passez le au format.

113
Oded

Si j'ai bien compris, vous avez besoin du code suivant. (passage de 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 c'est utile

22
Marinpietri

Les expressions Lambda ont le type Action<parameters> (au cas où elles ne renverraient pas de valeur) ou Func<parameters,return> (au cas où elles auraient une valeur de retour). Dans votre cas, vous avez deux paramètres d'entrée et vous devez renvoyer une valeur. Vous devez donc utiliser:

Func<FullTimeJob, Student, FullTimeJob>
7
SztupY

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

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

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

Vous pouvez ensuite appeler votre méthode GetJobs en lui transmettant 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 PascalCase pour les noms de méthode - GetJobs, pas getJobs.

4
devdigital