2016-12-11 36 views
2

我有這樣的方法:兩個HashSets搜索

bool CheckIfAvailable(HashSet<int> hayStack1, HashSet<int> hayStack2, int needle) { 
} 

而且我想做到以下幾點:如果hayStack1hayStack2null方法應該返回true,如果其中一人是不是nullneedle應該在它返回true,如果他們都不是nullneedle可以在其中任何一個或兩者都是true

我可以做到這一點,但我的做法非常混亂,有沒有辦法以優雅的方式做到這一點?

回答

2
bool CheckIfAvailable(HashSet<int> hayStack1, HashSet<int> hayStack2, int needle) 
{ 
    bool? s1 = hayStack1?.Contains(needle); 
    bool? s2 = hayStack2?.Contains(needle); 
    if (s1 ?? s2 ?? true) return true; 
    return s2 == true; 
} 

說明:

if (s1 ?? s2 ?? true)只爲真時:

s1 == s2 == null或者s1 == true || (s1 == null && s2 == true)

return s2 == true;由於s1可能會變成錯誤,我們檢查s2是否爲真。

可以用單個return語句替換它。

bool CheckIfAvailable(HashSet<int> hayStack1, HashSet<int> hayStack2, int needle) 
{ 
    bool? s1 = hayStack1?.Contains(needle); 
    bool? s2 = hayStack2?.Contains(needle); 
    return (s1 ?? s2 ?? true) || s2 == true; 
} 
+0

這是一個乾淨的方法謝謝 – m2008m1033m

+0

很好。你能否進一步解釋爲什麼'返回s2 == true;'是必要的?它與併發有關嗎? –

+1

@TadijaBagarić這是針對s1 == false和s2 == true的情況。 – m2008m1033m

1
bool CheckIfAvailable(HashSet<int> hayStack1, HashSet<int> hayStack2, int needle) 
{ 
    if(hayStack1 == null && hayStack2 == null) 
    { 
     return true; 
    } 
    else if(hayStack1 != null && hayStack1.Contains(needle)) 
    { 
     return true; 
    } 
    else if(hayStack2 != null && hayStack2.Contains(needle)) 
    { 
     return true; 
    } 
    return false; 
} 

或者

bool CheckIfAvailable(HashSet<int> hayStack1, HashSet<int> hayStack2, int needle) 
{ 
    bool setsAreNull = hayStack1 == null && hayStack2 == null; 
    bool hayStack1ContainsNeedle = hayStack1 != null && hayStack1.Contains(needle); 
    bool hayStack2ContainsNeedle = hayStack2 != null && hayStack2.Contains(needle); 

    return setsAreNull || hayStack1ContainsNeedle || hayStack2ContainsNeedle ; 
}