2017-08-14 31 views
-3

我有這個條件:的情況是真實的,即使它應該是假的

if (((s.Id == r.Reserved.Id && (r.DateFrom < DateTime.Now || datumod2 == datumted2)) && (r.DateTo > DateTime.Now || datumdo2 == datumted2)) || (!r.Reserved.IsReserved)){} 

條件的第一部分是s.Id == r.Reserved.Id這意味着它應該只是true如果ID是相同的。但是,即使s.Id = 4且r.Reserved.Id = 7,條件爲true。手鐲有問題嗎?我找不到任何東西。

+2

也許將它分解爲變量,因此它不是所有一個不可讀的行。 – Ryan

+1

最後的|| (!r.Reserved.IsReserved)'忽略ID –

+1

我認爲這是真的,因爲!r.Reserved.IsReserved是真的。 – Ben

回答

3

這是你的表情。

(
    (
     s.Id == r.Reserved.Id && 
     (r.DateFrom < DateTime.Now || datumod2 == datumted2) 
    ) && 
    (r.DateTo > DateTime.Now || datumdo2 == datumted2) 
) || 
    (!r.Reserved.IsReserved) 

正如你可以看到,當它不是全部擠在一條線,病情也時!r.Reserved.IsReserved是真的是真的。現在

,設有一對夫婦混亂的括號,因此讓我們這些出來:

(
    s.Id == r.Reserved.Id && 
    (r.DateFrom < DateTime.Now || datumod2 == datumted2) && 
    (r.DateTo > DateTime.Now || datumdo2 == datumted2) 
) || !r.Reserved.IsReserved 

和重組,以避免重複datumod2檢查:

!r.Reserved.IsReserved || 
    s.Id == r.Reserved.Id && 
    (datumod2 == datumted2 || 
     r.DateFrom < DateTime.Now && r.DateTo > DateTime.Now) 

,也許使得這種擴展(語法可能是錯誤的,但你明白了):

public static bool IsInside<T : IComparable<T>>(this T x, T lower, T upper) { 
    return lower < x && x < upper; 
} 

爲:

!r.Reserved.IsReserved || 
    s.Id == r.Reserved.Id && 
    (datumod2 == datumted2 || DateTime.Now.IsInside(r.DateFrom, r.DateTo)) 

這很難說,在這一點上沒有上下文,但也許你會想要做一個函數:

private static bool SatisfiesCondition(Foo r, Bar s, Baz datumod2, Baz datumted2) { 
    if (!r.Reserved.IsReserved) 
     return true; 

    if (s.Id != r.Reserved.Id) 
     return false; 

    if (datumod2 == datumted2) 
     return true; 

    return DateTime.Now.IsInside(r.DateFrom, r.DateTo); 
} 

重排條件,並挑選最大可理解,瞧名稱:

if (SatisfiesCondition(r, s, datumod2, datumted2)) { 
    ⋮ 
} 

它具有拼寫出哪些值會影響條件的額外好處。

0

TL; DR -
!r.Reserved.IsReserved是真


讓我們拆開你的IF語句,以瞭解該問題:

if (
    ( 
    // Condition One 
     (s.Id == r.Reserved.Id && 
      (r.DateFrom < DateTime.Now || datumod2 == datumted2) 
     ) && 
     (r.DateTo > DateTime.Now || datumdo2 == datumted2) 
    // End Of Condition One 
    ) || 
    (!r.Reserved.IsReserved) // Condition Two 
) 

因爲使用OR運營商(|| )如果條件(1或2)中的任何一個爲真,您的if語句將返回True。也就是說,如果您確定Condition One應該是False並且您仍然變爲True,那麼意味着您的Condition Two是True - 即!r.Reserved.IsReserved爲True

相關問題