2012-01-17 60 views
4

我記得在這裏看到關於該同樣的問題,那裏的東西,如:針對多個值測試變量?

if(x==null || x==" " || x==" " || x=="\n")... 

最終成爲長和醜陋的字符串,但得到的答覆是,不是偉大,我不記得這是什麼。

我正在學習關於MySQL的教程,並且SQL中解決問題的方式是使用關鍵字「IN」。

WHERE value IN (1 , 22, 35)... 

所以我在想,如果它被認爲是低效或不好的做法,這樣做:

object[] BadVals = {null, " ", " ", "\n"}; 
if(Array.IndexOf(BadVals, x) != -1)... 
+0

這有效,但我會使用LINQ來代替。 – linuxuser27 2012-01-17 01:00:30

+0

@ linuxuser27,我一直在想:我知道LINQ讓所有事情都變得更容易輸入,但它是否更有效? – mowwwalker 2012-01-17 01:01:51

+0

「switch」語句非常有效且可讀。 – 2012-01-17 01:04:42

回答

6

這在理論上肯定沒有效率,直接if測試,但這是一個紅鯡魚。真正的問題是:你關心嗎?

這個問題有兩個方面。

  1. 那麼如果它變慢呢?如果你沒有在一個執行一百萬次的CPU綁定循環上運行它,那麼這種差別純粹是理論上的。使用任何提供更多無錯代碼的方式,這些代碼都是閱讀和維護的樂趣。
  2. 那麼,如果它更醜?你會寫這麼多次嗎?當然不是 - 如果你打算使用很多次,把它放在一個命名好的方法中,不要再考慮它。

對於LINQ的方法,這比略短,有點更具可讀性你有什麼:

if((new[] { null, " ", " ", "\n" }).Contains(x)) ... 

你倒是可能需要另寫擴展方法,可以讓你與調用此操作數位置顛倒了,例如

if(x.In(new[] { null, " ", " ", "\n" })) ... 

判決:我倒是與LINQ去超過3個左右的值再次進行測試,前提是沒有其他檢查這些值(更明顯的方式例如,在這種情況下IsNullOrWhiteSpace是非常接近)並且沒有明顯的性能影響。否則,if已嘗試並且爲true。

+0

LINQ是更簡潔的代碼。如果您有大量值要檢查,請使用更適合的列表。 – 2015-03-23 07:15:50

3

不一定是不好的做法,但也有一些其他的方式。一對夫婦不同的方式是:

  1. 對空/空字符串,

    String.IsNullOrEmpty(s.Trim()); 
    
  2. IsNullOrWhiteSpace在4.0:

    String.IsNullOrWhitespace(s.Trim()); 
    
  3. 像SQL IN操作:

    if((new[] {" ", " ", "\n"}).Contains(s)) 
    { 
    } 
    
+2

不幸的是,當's'爲空時,這會爆炸。我使用一個輕微的變體:if((s ??「」「).Trim()==」「){/ *」empty「* /}' – 2012-01-17 01:10:45

+0

@pst,更好的答案更好的方法(4.0)。 – 2012-01-17 01:16:50

1

這些風格問題很少是絕對的,很大程度上取決於正在解決的具體問題,以及組織因素和個人喜好。這就是說,一個廣受好評的參考文獻(史蒂夫麥克唐奈的代碼完整版)建議simplify complicated tests with boolean function calls作爲降低if語句複雜性的一種手段。舉例來說,人們可能會喜歡的東西代替,如果上述聲明:

if (IsStringFoo(s)) {...} 

在其他地方定義爲

// Returns true if and only if the input string is a Foo 
bool IsStringFoo(string s) 
{ 
    return s == "" || s == " " || s == "\n"; 
    // or use the alternate array syntax here instead if you prefer 
} 

這傳達給消費者不只是邏輯機制,同時也可能爲這些經營理力學,因此可能提高可讀性。

使用in建議的語法可能會遇到類似的可讀性問題 - 特別是,仍然不清楚爲什麼這些特定的測試正在完成。後一種方法可能更難以理解,因爲「或」以Array.IndexOf方式傳遞布爾邏輯操作並不一定。