2011-08-16 34 views
4

我有這樣一個情況:在未來更好的語法形式的if語句

if (string.IsNullOrEmpty(filename) || size != "Large" || size != "Medium" || size != "Small") 

概率我將不得不管理在if語句的更多size

我想知道是否存在一個更易於管理和可讀的方式來編寫此條件。

請提供一個真實的例子,謝謝你在這裏的時間。

回答

6

你可以把單詞的一個HashSet,並檢查:

HashSet<string> filterWords = new HashSet<string>(); 
// Put all words in the hash set 


if (filterWords.contains(size)) 
{ 
    // Do what ever you need 
} 
+0

任何IEnumerable都可以,不是嗎? HashSet就是一個例子,但你也可以使用數組。 –

+0

哈希應該比其他人更快地進行字符串匹配。 – 2011-08-16 11:15:25

+0

另外考慮使用'var hashSet = new HashSet (StringComparer.InvariantCultureIgnoreCase);'if'larGE','Large','large'等。應該是一樣的。 – Oliver

1

選項1:

寫一個小功能,它返回一個布爾值,只有包含了規模測試和使用,在您的if

if (string.IsNullOrEmpty(filename) || GoodSize(size)) 
{ 
//... 
} 

private bool GoodSize(string size) 
{ 
    return size != "Large" || size != "Medium" || size != "Small"; 
} 

選項2:

創建的尺寸列表再次進行測試,並使用Contains

var goodSizes = new[] { "Large", "Medium", "Small" }; 
if (string.IsNullOrEmpty(filename) || !goodSizes.Contains(size)) 
{ 
    //... 
} 

而且你可以更好的清晰度和封裝合併這兩個選項。

3
// you could externalize and manage this list somewhere else 
var sizes = new[] { "Large", "Medium", "Small" }; 

if (string.IsNullOrEmpty(filename) || !sizes.Contains(size)) 
{ 
    ... 
} 
+0

爲什麼使用數組而不是散列集? – abatishchev

+0

@abatishchev,爲什麼使用HashSet而不是數組:-) HashSet確實會更好,因爲它會更快找到元素,並且它們保證是唯一的。 –

+1

@Darin當然,如果3項列表中的性能改進對整體代碼產生了很大的影響,我很想看看他們如何快速獲得其他代碼:-) –

1

如果他們要改變,或許是一個靜態列表更好:

private static List<string> Sizes = new List<string> { "large", "medium", "small" }; 

if (string.IsNullOrEmpty(filename) || Sizes.Contains(size.ToLower())) 
{ 

} 

對於更清潔的代碼,在需要時封裝尺寸的檢查到它自己的方法,並修訂該法:

if (MeetsSizeRequirementsOrIsNull(filename, size)) 
{   
} 

private static bool MeetsSizeRequirementsOrIsNull(string filename, string size) 
{ 
    List<string> sizes = new List<string>() { "..." }; 

    return string.IsNullOrEmpty(filename) || sizes.Contains(size.ToLower()) 
} 
+0

您可能想要使用Enumerable。包含()'帶'StringComparer.OrdinalIgnoreCase' – abatishchev

+0

@abatishchev語義,它們都實現相同,它只是一個例子。這也假定案件不是必需的。 –

+0

無論如何,使用ToLower()/ ToUpport()進行字符串比較是非常糟糕的做法。所以我不建議使用這個例子,因爲有人可以開始這樣做。 – abatishchev

1

如果作爲測試結果有多個事情要做,則將其作爲開關/外殼寫出可能會更具可讀性。

否則,如果你有這些值的負載,它可能會更好的保留在一些字典中的列表 - 比如說notHandledSizes。分配「Large」=> true,「Medium」=> true,...並檢查該字典中是否存在size

1

你所做的事看起來是最直接的做法。任何修改都將簡單地將混亂轉移到其他地方。如果你不需要在其他任何地方重用這個代碼,我會保持它的方式。

1

下面的換行符使其更具可讀性。

if (string.IsNullOrEmpty(filename) || 
    size != "Large" || 
    size != "Medium" || 
    size != "Small") 

設計提示

如果許多對象長伴你,如果條件涉及,這是很好寫的小屬性/方法,返回真/在這些類假。

if (string.IsNullOrEmpty(filename) || object.IsProperSize) 

有時枚舉標誌屬性也有助於這種情況。看看here有一個很好的解釋。

+0

有趣的語法和標誌 – GibboK