2011-09-21 3 views
2

나는 List를 필터링하기 위해 일련의 메소드를 사용하는 C# 클래스를 사용한다. 필자는 본질적으로 다른 방법과 같은 방법으로이 작업을 수행합니다. 따라서 a (values)는 b (List values) 또는 exit b (List values) 출력 호출을 기반으로 일부 필터링을 수행하고 출력 호출 c (List values)를 기반으로 필터링을 수행합니다.체인에서 서로를 호출하는 메소드를 피하는 방법은 무엇입니까?

이 코드를 체인에서 제거하고 (List values)를 호출하는 메소드에서 모든 것을 제어하려고합니다. if-else-if를 사용할 수는 있지만 너무 많은 if-else-ifs로 이어질 것입니다.

이 문제를 해결할 수있는 디자인 패턴이 있습니까? 아니면 일부 알 고요? 어떤 도움을 주셔서 감사합니다.

감사합니다. Gaurav

+1

왜? 충분한 정보를 제공하지는 않았지만 모든 것을 한 가지 방법으로 옮기는 것이 개선 된 것처럼 보이지는 않습니다. –

+0

왜 필터를 하나의 필터에 결합하지 않습니까? –

+0

질문이 명확하지 않습니다. 출력의 어떤 속성은'a'가'b'를 호출해야하는지 아니면 종료해야 하는지를 결정합니다. 필터링 된 목록이란 무엇입니까? 코드를 사용하여 몇 가지 예를 들어주십시오. 어쩌면 가설적인 필터링과 결정 알고리즘을 사용했을 것입니다. –

답변

2

당신은 (쉽게 iterator blocks와 C#으로 구현 될 수있다) 반복자 패턴 LINQ를 사용하는 일반적인 시나리오와 같은 discribinq 소리는 무엇인가.

var results = 
    someCollection 
     .Where(c => c.SomeProperty < someValue * 2) 
     .Where(c => c.OtherProperty == "hi") 
     .OrderBy(c => c.AnotherProperty) 
     .Select(c => new {c.SomeProperty, c.OtherProperty}); 

또는 쿼리 식으로

:

var results = from c in SomeCollection 
      where c.SomeProperty < someValue * 2 
      where c.OtherProperty == "Hi" 
      orderby c.AnotherProperty 
      select new {c.SomeProperty, c.OtherProperty}; 

당신은 체인 많은 작업 당신은 할 수있다. 물론 조인 및 그룹화와 같은 훨씬 더 고급 작업도 사용할 수 있습니다.

이 기술 (및 많은 기술)을 배우고 싶다면 Jon Skeet의 도서를 권합니다.

+0

왜 나는 그것이 작동하지 않는다고 생각한다. ** 이전의 출력에 따라 ** 필터를 호출하려고한다. 예제에서'.Where (c => c.OtherProperty == "hi")'가 무조건 실행되지 않는다는 것을 의미합니다. LINQ로 어떻게 모델링 하시겠습니까? –

1

난에서 코드를 체인이 방법을 제거하는 방법에 이르기까지 모든 것을 제어하려는 당신이 값을 필터링하고 이후 (목록 값) 잘

당신이 LINQKit PredicateBuilder 같은 것을 사용할 수 호출하는있는 것 필터 목록을 만들고이를 linq exprssion에 적용 할 수 있습니다.

그러나 필터 만하는 것이 아니라면 Action<T> Delegate의 인스턴스를 작성하여 목록에 수행 할 수있는 작업을 나타낼 수 있습니다. 그들을 적용하십시오.

Continuation Passing Style CPS을 사용할 수도 있지만 그 작업으로 내 귀가 흘러 나오는 것을 생각해보십시오.

+0

CPS가 좋습니다 ... C# 구문과 함께 사용하는 것은 너무 어색합니다 : - / –

관련 문제