2011-04-08 1 views
2

이것은 정말 어색해 보입니다 ... 아무도 깨끗한 접근 방법에 대한 제안이 있습니까?C#에서는이 부울 값을 쓸 좋은 방법이 있습니다

C#을
bool case1 = (dte.StartDateTime >= Date) && (dte.StartDateTime < Date.AddHours(_interval)); 
    bool case2 = (dte.EndDateTime > Date) && (dte.EndDateTime < Date.AddHours(_interval)); 
    bool case3 = (dte.StartDateTime <= Date) && (dte.EndDateTime >= Date.AddHours(_interval)); 
    return ((dte.Association == Association) && (case1 | case2 | case3)); 

은 2.0

아이디어는 그것의 자신의 방법으로 이러한 부울 과제를 각각 이동하여 코드를 더 자기 문서화을 한 후 일을 정확히하는 방법을 이름을 지정하는 것입니다
+0

나는 실제로 당신이 한 것을 좋아합니다. :) – JonH

+6

그건 내 눈에시 음악과 내 귀에 음악. –

+0

불필요한 괄호가 많이 있습니다. – codymanix

답변

2

글쎄,이 코드를 언급, 그래서 누군가가 실제로 코드가하고 효과적인 만민이 무엇인지 이해할 수 있다는 것이다 단기 우리는 한 번만 종료 날짜를 찾습니다.

+0

점 찍어 ... 감사합니다. – Brad

2

하나 .NET 부울 값에 설명이 포함 된 이름을 제공합니다. 그러나 정직하게, 당신이 거기에있는 것은

+1

추가 방법의 정의를 찾아야하므로 실제적으로 * 복잡성이 증가한다고 말할 수 있습니다. 이것이 앱의 다른 어느 곳에서도 사용하지 않는 단 한 줄의 코드라면, 그대로 두십시오. –

+0

여기에 자체 문서를 추가하려면 case1/case2/case3의 이름을보다 구체적인 이름으로 바꾸십시오. – Artemix

2

당신이 쓸 수있는 도우미 메서드, InRange 쓰기 나쁘지 않다 :

bool case1 = DateTimeHelpers.InRange(dte.StartDate, Date, Date.AddHours(_interval)); 
+0

또한 Date.AddHours를 메서드에 넣고 간격 만 전달합니다. –

+0

예, AddHours를 한 번 호출하는 것은 3 번 호출하는 것보다 낫습니다. –

1

당신은 그런데

return (
    dte.Association == Association 
    && ((dte.StartDateTime >= Date && dte.StartDateTime < Date.AddHours(_interval)) 
    || (dte.EndDateTime > Date && dte.EndDateTime < Date.AddHours(_interval)) 
    || (dte.StartDateTime <= Date && dte.EndDateTime >= Date.AddHours(_interval)) 
    ) 
); 

처럼 쓸 수를 - 정확히 기억한다면 && 연산자가 &과 다르다. 조건이 실패하면 첫 번째 오류가 발생하고 다른 조건은 확인하지 않는 반면 두 번째 것은 모두 오류를 확인하지는 않지만이를 확인해야합니다.

업데이트

네, 그것은 그 방법, && Operator (C# Reference)를 참조하십시오.

+0

맞습니다. '&&'연산자 **는 ** 단락을 의미합니다. 첫 번째 문장이 진술을 사실로 만들기에 충분하다면 다른 조건을 검사하지 않습니다. 거의 항상 논리적 * 비교에 사용하기를 원합니다. 단일 '&'연산자는 * 비트 별 * AND 연산자에 사용되며 논리 표현식에서 단락되지 않습니다. –

+0

나는 이것을 읽는데 어려움을 겪고있다. 우리는 몇몇 OR이 누락되어있다. – Brad

+0

@ 브래드 : 당신 말이 맞아, 나는 마지막 행에있는 OR들을 AND로 잘못 읽었다. 그리고 슬프게도 그것은 나의 해결책을 악화시킨다. : \ – Albireo

1

은 어쩌면이 더 낫지 만, 짧은 : || 빨리 때문에 당신이 대신 | 대부분의 시간의 ||를 사용해야합니다

DateTime end = Date.AddHours(_interval); 

return dte.Association == Association 
    && (dte.StartDateTime >= Date && dte.StartDateTime < end 
    || dte.EndDateTime > Date && dte.EndDateTime < end 
    || dte.StartDateTime <= Date && dte.EndDateTime >= end); 

참고. 더 중요 할 것

한 가지

// this seems to rule out everything 
if(dte.Association != Association) return false; 
// find end 
var endInterval = Date.AddHours(_interval); 

return ((dte.StartDateTime >= Date) && (dte.StartDateTime < endInterval)) 
    || ((dte.EndDateTime > Date) && (dte.EndDateTime < endInterval)) 
    || ((dte.StartDateTime <= Date) && (dte.EndDateTime >= endInterval)); 

이 다음이다 ..

+0

고마워요. – Brad

관련 문제