2010-12-01 64 views
1

我有一個字符串數組,我希望找出該數組是否不包含某個字符串。我可以結合使用NOT運算符與包含方法,像這樣(!)(!)C#:擴展方法和Not運算符最佳實踐

if (!stringArray.Contains(searchString)) 
{ 
    //do something 
} 

的不操作掃描代碼,所以我不知道什麼時候,如果它被認爲是不好的做法,可能會被忽略的創建在試圖擴展方法,以提高可讀性:

public static bool DoesNotContain<T>(this IEnumerable<T> source, T value) 
{ 
    return !source.Contains<T>(value); 
} 

所以,現在的代碼能讀:

if (stringArray.DoesNotContain(searchString)) 
{ 
    //do something 
} 

是這樣的事情令人難以接受的?

+1

這吸引了答案令人難以置信的數字之前我甚至可以組裝一個連貫的思想:避免不必要的複雜性。另外,如果你擔心人們會忽略`!`操作符,那麼肯定會拋出泛型和擴展方法不是解決方案。 – 2010-12-01 17:00:08

+0

因爲這個問題本質上是主觀的,這是否應該成爲社區維基?我看不到如何做到這一點。在創建社區wiki之前,你是否必須具備一定的聲譽? – 2010-12-01 17:11:53

回答

2

保持!這是在線以上的評論將有助於可讀性的地方。
(我懷疑!更有效率)

//If the word is NOT in the array then... 

還有一點就是無論你是死心塌地使用數組? 有一些(你可能會也可能不知道)稱爲HashSet

如果您唯一的目的是檢查一個字符串是否在列表中,那麼您基本上正在查看集算術。

除非您正在使用該數組來查找某個特定術語是否在其中,否則請嘗試使用HashSet ...要快得多。

3

就個人而言,我不會爲如此簡單的事情做一個擴展方法。我明白,你正在試圖保持它的可讀性,但大多數C#開發人員應該抓住!運營商。它被大量使用,甚至初學者通常認識到它。

+0

我同意這一點!運營商是不應該被忽視的東西,但也同意這是個人偏好。 – jimplode 2010-12-01 16:50:07

1

在.NET框架中從未見過DoesNot *方法,所以我認爲你的問題與!被高估了。

2

似乎不必要,!source.Contains<T>(value);是非常可讀的。此外,使用現有的Contains函數意味着您的代碼將更具可移植性(即,它不會依賴於您的擴展方法存在)。

1

我想這是一個人際選擇而不是好的/壞的做法。國際海事組織我喜歡擴展方法,因爲它更具說明性,因此更具可讀性,乍一看,您確切知道它的功能。只是我的2美分

1

這聽起來像一個壞主意,現在您的代碼的消費者必須知道兩種方法(DoesNotContainContains)而不是一個。一般來說,我會避免XXNotXX方法。

2

我一定會用!stringArray.Contains(string)。這是所有開發人員使用的99.9%。 DoesNotContain至少會讓我感到困惑。

0

如果我打算在項目中頻繁使用,我個人會爲此做一個擴展方法。如果它是一個關閉,那麼我不會打擾,但它並不是非常糟糕的做法。

我會這麼做的原因是因爲if()有更多的上下文一目瞭然。好的,任何擁有腦細胞的人都會知道當前的陳述是做什麼的,但它會更好。每個人都會有自己的喜好,然後...

我做了格式化字符串的擴展方法只是爲了讓代碼流比較好...

0

!something不起作用時,則回落到something == false

2

我認爲你的問題是基於一個錯誤的前提。即開發人員將在代碼中讀取!!布爾運算符是衆多流行編程語言(C,C++,C#,Java等)中非常有名的運算符。任何可能經常閱讀!的人可能都沒有在事前仔細檢查代碼。

感覺就像你`重新說出以下

我希望人們能在C#代碼,但我不信任他們讀它,因此我會在我的代碼基礎,以創建一個新的方言用擴展方法。

爲什麼要停止運營商!?看起來他們可能錯過+,+=表達式或讀取|作爲||

0

我比選項2更喜歡選項1.擴展方法非常酷,非常適合用於頻繁使用的轉換或比較等事情。但是,Microsoft建議謹慎使用擴展方法。

0

我真的會考慮擴展方法,除了否定表達否定做法以外別無它物。

什麼:

if (stringArray.Contains(searchString) == false) 
{ 
    //do something 
}