2010-04-27 9 views
1

에서 분기하여 최적화합니다. this.AllowChooseAny.Value? radioSpecific.Checked? UserManager.CurrentUser.IsClient? txtSubject.Text : subjectDropDownList.SelectedItem.Text : String.Empty : UserManager.CurrentUser.IsClient? txtSubject.Text : subjectDropDownList.SelectedItem.Text; 조건부 연산자를 C#

이하 복잡한 형태로

:
return any ? 
    specified ? 
     isClient ? textbox : dropdown : 
     empty : 
    isClient ? textbox : dropdown; 

또는 개략적 인 형태로

:

     | 
        any 
      /   \ 
     specified    isClient 
    /  \   /  \ 
    isClient empty  textbox dropdown 
/  \ 
textbox dropdown 

분명히 내가 두 개의 서로 다른 수준에 중복 된 블록이있다. 아마도이 코드를 최적화하여 하나의 코드로 나눌 수 있습니까? 또는 그런 일 ..

+14

내가 이것으로 실행 한 경우 내가 ..... 포크로 –

+0

을 내 눈을 찌를 것 내가 ReSharper에서를 사랑하지만 누군가가 반환 교체와 함께 너무 행복 얻었다처럼 확실히 보인다! 그리고 당신의 의견 @Matt은 나를 직장에서 웃으면 서 파산 시켰습니다. –

답변

5
any && !specified ? 
    empty : 
    isClient ? textbox : dropdown; 
6

이 당신의 표현을 단순화 할 수 있습니다 :

if (any && !specified) 
{ 
    return empty; 
} 
else 
{ 
    return isClient ? textbox : dropdown; 
} 
+0

+1 가독성을 위해 –

11

코드 블록이 거의 읽을 수 없습니다. 삼항 연산자의 목적으로 삼항 연산자를 사용하지 마십시오. 거기에 thigs를 만들려면 을 읽을 수 있습니다. 매우 간단한 표현을 위해 if 블럭을 제거했습니다. 당신이 가진 것이 아닙니다.

+0

+1을 보상합니다. :-) –

+0

나는 당신과 동의하지만, 당신은 질문에 대답하지 않았다. – Andrey

+0

읽을 수있는 코드는 최적화의 한 형태입니다. – RvdK

0

isClient ? textbox : dropdown 블록을 메서드에 넣고 원래의 분기 = 더 이상 코드 중복이없는 메서드 호출을 만듭니다.

관련 문제