我有這樣一個情況:在未來更好的語法形式的if語句
if (string.IsNullOrEmpty(filename) || size != "Large" || size != "Medium" || size != "Small")
概率我將不得不管理在if
語句的更多size
。
我想知道是否存在一個更易於管理和可讀的方式來編寫此條件。
請提供一個真實的例子,謝謝你在這裏的時間。
我有這樣一個情況:在未來更好的語法形式的if語句
if (string.IsNullOrEmpty(filename) || size != "Large" || size != "Medium" || size != "Small")
概率我將不得不管理在if
語句的更多size
。
我想知道是否存在一個更易於管理和可讀的方式來編寫此條件。
請提供一個真實的例子,謝謝你在這裏的時間。
你可以把單詞的一個HashSet,並檢查:
HashSet<string> filterWords = new HashSet<string>();
// Put all words in the hash set
if (filterWords.contains(size))
{
// Do what ever you need
}
選項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))
{
//...
}
而且你可以更好的清晰度和封裝合併這兩個選項。
// you could externalize and manage this list somewhere else
var sizes = new[] { "Large", "Medium", "Small" };
if (string.IsNullOrEmpty(filename) || !sizes.Contains(size))
{
...
}
爲什麼使用數組而不是散列集? – abatishchev
@abatishchev,爲什麼使用HashSet而不是數組:-) HashSet確實會更好,因爲它會更快找到元素,並且它們保證是唯一的。 –
@Darin當然,如果3項列表中的性能改進對整體代碼產生了很大的影響,我很想看看他們如何快速獲得其他代碼:-) –
如果他們要改變,或許是一個靜態列表更好:
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())
}
您可能想要使用Enumerable。包含()'帶'StringComparer.OrdinalIgnoreCase' – abatishchev
@abatishchev語義,它們都實現相同,它只是一個例子。這也假定案件不是必需的。 –
無論如何,使用ToLower()/ ToUpport()進行字符串比較是非常糟糕的做法。所以我不建議使用這個例子,因爲有人可以開始這樣做。 – abatishchev
將大小放在某種集合中,並使用「Contains」。請參閱MSDN中的示例:http://msdn.microsoft.com/en-us/library/bb352880.aspx
如果作爲測試結果有多個事情要做,則將其作爲開關/外殼寫出可能會更具可讀性。
否則,如果你有這些值的負載,它可能會更好的保留在一些字典中的列表 - 比如說notHandledSizes
。分配「Large」=> true,「Medium」=> true,...並檢查該字典中是否存在size
。
你所做的事看起來是最直接的做法。任何修改都將簡單地將混亂轉移到其他地方。如果你不需要在其他任何地方重用這個代碼,我會保持它的方式。
任何IEnumerable都可以,不是嗎? HashSet就是一個例子,但你也可以使用數組。 –
哈希應該比其他人更快地進行字符串匹配。 – 2011-08-16 11:15:25
另外考慮使用'var hashSet = new HashSet(StringComparer.InvariantCultureIgnoreCase);'if'larGE','Large','large'等。應該是一樣的。 –
Oliver