[c#] C # 메서드 매개 변수로 Lambda 식 전달

전달하고 재사용 할 수있는 람다식이 있습니다. 코드는 다음과 같습니다.

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 메서드 내의 두 번째 인수입니다. 나는 Action 또는 Func를 사용하고 싶다고 가정하고 있지만 구문이 무엇인지 또는 어떻게 작동하는지 잘 모르겠습니다. 누군가 나에게 예를 들어 줄 수 있습니까?



답변

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

또는 람다를 변수에 할당하고 전달 합니다 .


답변

내가 이해하면 다음 코드가 필요합니다. (매개 변수로 표현식 람다 전달) 방법

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");

도움이 되었기를 바랍니다.


답변

Lambda 식에는 Action<parameters>(값을 반환하지 않는 경우) 또는 Func<parameters,return>(반환 값이있는 경우) 유형이 있습니다. 귀하의 경우에는 두 개의 입력 매개 변수가 있고 값을 반환해야하므로 다음을 사용해야합니다.

Func<FullTimeJob, Student, FullTimeJob>


답변

대리자 유형을 사용하고이를 명령 매개 변수로 지정해야합니다. – 당신은 대리인 유형에 내장 된 중 하나를 사용할 수 ActionFunc.

귀하의 경우에는 대리자가 두 개의 매개 변수를 사용하고 결과를 반환하므로 다음을 사용할 수 있습니다 Func.

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

그런 다음 GetJobs델리게이트 인스턴스를 전달하는 메서드 를 호출 할 수 있습니다. 이는 해당 서명, 익명 대리자 또는 람다 식과 일치하는 메서드 일 수 있습니다.

– PS 당신은 메소드 이름에 대한 PascalCase을 사용해야 GetJobs하지 getJobs.


답변