2013-01-12 7 views
74

저는 전달하고 재사용 할 수있는 람다식이 있습니다. 여기에 코드입니다 :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 메서드 내에서 두 번째 인수입니다. 나는 Action이나 Func을 사용하고 싶다고 가정하고 있지만 구문이 무엇인지 또는 어떻게 작동하는지 잘 모르겠습니다. 누군가가 내게 모범을 보일 수 있습니까?

+2

매개 변수를 액션 또는 Func을 확인 유용 희망

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

호출. –

+0

맞아, 그게 내가 생각한 ... 내가 어떻게 할 수 있는지 보여 줄 수있어? –

+0

[C# 람다 식을 함수 인수로 사용할 수 있습니다] (http : // stackoverflow.com/questions/5396746/c-sharp-lambda-expressions-as-function-arguments) – user

답변

91

은 매개 변수 형식으로 Func<T1, T2, TResult> 대리자를 사용하고 그것을 통과하여 Query :

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

을 또는 변수에 람다를 할당하고 에게 전달할 :

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

당신은 그것을 부를 것이다 인치

+0

이것은 매우 좋게 보이며이 getJobs 메서드의 람다를 어떻게 정의할까요? 즉, getJobs()를 호출하기 전에 람다를 정의하는 것처럼 보이는 것은 무엇입니까? –

+0

@AdamLevitt - 예제 코드와 동일합니다. 답변에 추가됩니다. – Oded

+0

또한 어쨌든 함수 매개 변수가 동적 일 수 있습니까? –

4

람다 식의 형식은 Action<parameters>입니다. 반환 값) 또는 Func<parameters,return> (반환 값이있는 경우). 귀하의 경우에는 두 개의 입력 매개 변수를 가지고, 당신은 값을 반환해야합니다, 그래서 당신은 사용해야

Func<FullTimeJob, Student, FullTimeJob> 
4

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

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

당신은 다음 GetJobs 방법은 대리자 인스턴스를 전달 호출 할 수 대리자는 두 개의 매개 변수를, 그 결과를 반환처럼 당신이 Func을 사용할 수 있습니다 귀하의 경우

, 그것은 보인다. 이 서명, 익명의 대리자 또는 람다 식과 일치하는 메서드가 될 수 있습니다.

P. getJobs이 아닌 GetJobs의 메소드 이름에는 PascalCase를 사용해야합니다.

19

다음 코드가 필요하다고 이해하면. 이 예입니다 참조, 당신은 자신의 클래스에서 동일한 기능을 수행 할 수있는 방법을 호출

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

을 방법

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 
    } 

을 (매개 변수로 표현 람다 통과) .

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

방법 나는이

+1

왜'.Where'에'Compile()'이 필요한지 설명 할 수 있습니까? 나는 그것도 없이는 효과가있는 것을 보았다. –

관련 문제