web-dev-qa-db-ja.com

C#メソッドメソッドとしてラムダ式を渡す

私はラムダ式を持っているので、それをやり取りして再利用したいと思います。コードは次のとおりです。

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>();   
  }   

ここで重要なのは、ここで使用しているラムダ式を、このコードを呼び出しているメソッドに渡して、再利用できるようにすることです。ラムダ式は、.Queryメソッド内の2番目の引数です。私はActionまたはFuncを使用したいと思っていますが、これの構文が何であるか、またはそれがどのように機能するかはよくわかりません。誰かが例を教えてもらえますか?

92
Adam Levitt

Func<T1, T2, TResult> デリゲートをパラメータータイプとして使用し、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>();   
  }  
}

あなたはそれを呼ぶでしょう:

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

または、ラムダを変数に割り当ててitを渡します。

110
Oded

私が理解した場合、次のコードが必要です。 (式ラムダをパラメーターで渡す)メソッド

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
    }

呼び出し方法

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

クラスでも同じことができます。例を参照してください。

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;
    }

呼び出し方法

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

これが役に立つことを願っています

22
Marinpietri

Lambda式のタイプは、Action<parameters>(値を返さない場合)またはFunc<parameters,return>(返り値がある場合)です。あなたの場合、2つの入力パラメータがあり、値を返す必要があるため、次を使用する必要があります。

Func<FullTimeJob, Student, FullTimeJob>
7
SztupY

デリゲートタイプを使用し、それをコマンドパラメーターとして指定する必要があります。組み込みのデリゲート型の1つ、ActionおよびFuncを使用できます。

あなたの場合、デリゲートは2つのパラメータを取り、結果を返すように見えるので、Funcを使用できます。

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

その後、デリゲートインスタンスを渡すGetJobsメソッドを呼び出すことができます。これは、その署名、匿名デリゲート、またはラムダ式に一致するメソッドです。

追伸メソッド名にはPascalCaseを使用する必要があります-GetJobsではなく、getJobs

4
devdigital