2017-03-23 1 views
0

LINQ 문 또는 람다를 사용하여 다음을 구현할 수 있는지 궁금합니다. 나는이 두 가지를 처음 접했으므로 어떻게 코드화 될지 잘 모르겠습니다. 여러 콜백을 추가 할 수있는 Func <> 위임을 가져 와서 모든 반환 값의 부울 AND 표현식으로 평가하도록하는 것이 그 의도입니다. 선호되는 솔루션은 단일 false가 나머지 평가를 단락시킬 수있게합니다. 나는 무력 방식이 구현, 다음과 같이 코드와 출력은 같습니다 어떤 제안에 대한LINQ 또는 lambda를 사용하여 구현하는 방법은 무엇입니까?

using System; 
using System.Diagnostics; 
using System.Windows.Forms; 

namespace TestHarness 
{ 
    public partial class Form1 : Form 
    { 
     Func<bool, bool, bool, bool> validPosition; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      validPosition += Func1; 
      validPosition += Func2; 
      validPosition += Func3; 

      Delegate[] delegates = validPosition.GetInvocationList(); 

      bool composite = true; 
      int i = 0; 

      foreach (Func<bool, bool, bool, bool> d in delegates) 
      { 
       composite = composite & d(false, true, true); 
       if (!composite) 
        break; 
       ++i; 
      } 
      Debug.WriteLine("Result: " + composite + "\tIterations: " + i); 

      composite = true; 
      i = 0; 
      foreach (Func<bool, bool, bool, bool> d in delegates) 
      { 
       composite = composite & d(true, false, true); 
       if (!composite) 
        break; 
       ++i; 
      } 
      Debug.WriteLine("Result: " + composite + "\tIterations: " + i); 

      composite = true; 
      i = 0; 
      foreach (Func<bool, bool, bool, bool> d in delegates) 
      { 
       composite = composite & d(true, true, false); 
       if (!composite) 
        break; 
       ++i; 
      } 
      Debug.WriteLine("Result: " + composite + "\tIterations: " + i); 

      composite = true; 
      i = 0; 
      foreach (Func<bool, bool, bool, bool> d in delegates) 
      { 
       composite = composite & d(true, true, true); 
       if (!composite) 
        break; 
       ++i; 
      } 
      Debug.WriteLine("Result: " + composite + "\tIterations: " + i); 
     } 

     bool Func1(bool a, bool b, bool c) 
     { 
      return a; 
     } 
     bool Func2(bool a, bool b, bool c) 
     { 
      return b; 
     } 
     bool Func3(bool a, bool b, bool c) 
     { 
      return c; 
     } 
    } 
} 

Output: 

Result: False Iterations: 0 
Result: False Iterations: 1 
Result: False Iterations: 2 
Result: True Iterations: 3 

감사합니다.

+0

이에 주제 여기있는 동안; CodeReview.SE로 이동하여 코드 문제를 해결할 것을 고려해 볼 수 있습니다. – BradleyDotNET

+0

거기에 아무런 힘이 없습니다. 또한이 카운트가 정말로 필요합니까? –

+0

이것을 간단한 술어'Func '로 줄이면'&& '연산자로 연결하여 단락 문자를 사용할 수 있습니다. 그러나 나는 당신이 성취하려는 것을 확신하지 못합니다. 더 큰 그림은 무엇입니까? –

답변

2

개인적으로 사용자 지정 확장 메서드를 만들고 내부에 논리를 넣을 것입니다 (클로저 및 람다 오버 헤드를 피하기 위해 샘플에 foreach을 사용하는 것이 가장 가능성이 높습니다). 당신은 LINQ 솔루션에 관심이 있기 때문에 단, All 확장 방법은 당신이 필요로 정확히 :

결과 :

사실 소스 시퀀스의 모든 요소가 지정된 조건에서 테스트를 통과하면 , 또는 시퀀스가 ​​비어 있다면; 그렇지 않으면 거짓

단락 : 소스 열거 곧바로 결과가 결정될 수있는 바와 같이 정지

.

등가 샘플 LINQ 코드 :

var delegates = validPosition.GetInvocationList().Cast<Func<bool, bool, bool, bool>>(); 

Debug.WriteLine("Result: " + delegates.All(d => d(false, true, true))); 
Debug.WriteLine("Result: " + delegates.All(d => d(true, false, true))); 
Debug.WriteLine("Result: " + delegates.All(d => d(true, true, false))); 
Debug.WriteLine("Result: " + delegates.All(d => d(true, true, true))); 
+0

우수! 고맙습니다! – rhoward99

관련 문제