2010-02-04 44 views
0

我正在做一些驗證,我需要檢查兩個值之間的某些組合。例如,如果string1是「fruit」,則string2的有效值是「apple」,「banana」和「pear」。目前,我正在這樣做:驗證 - 尋找特定的值組合

switch(string1) 
{ 
    case "fruit": 
    if(string2 != "apple" && string2 != "banana") 
    { 
     return false; 
    } 
    break; 
    case "meat": 
    if(string2 != "beef" && string2 != "pork") 
    { 
     return false; 
    } 
    default: 
    return true; 
    break; 
} 

這實在是兩個問題。首先是,有沒有做一些更喜歡這個沒有什麼好的辦法:

switch(string1) 
{ 
    case "fruit": 
    if(string2 NOT IN ("apple", "banana")) 
    { 
     return true; 
    } 
    break; 
    case "meat": 
    if(string2 NOT IN ("beef", "pork")) 
    { 
     return false; 
    } 
    default: 
    return true; 
    break; 
} 

這個問題的第二部分很可能什麼都會先被回答:有沒有做這更好的/最好的方法是什麼?我不是世界上最驚人的編碼器,這是第一個「我頭頂」的解決方案,所以我肯定會對更好的解決方案開放。謝謝!

+0

難道你需要扭轉在第二個例子中返回的值? – ChrisF 2010-02-04 23:13:38

+0

糟糕,剪切並粘貼愚蠢 - 或將其更改爲NOT IN。謝謝@ChrisF。固定 – Zannjaminderson 2010-02-05 21:00:45

回答

2

尼克的答案的變化。創建兩個列表並使用contains方法來對付它們。

public List<string> Fruit = new List<string>{"apple", "banana"}; 
public List<string> Meat = new List<string>{"beef", "pork"}; 

switch (string1) 
{ 
    case "fruit": 
     return Fruit.Contains(string2); 
    case "meat": 
     return Meat.Contains(string2); 
} 
0

您可以縮短你的情況下來:

switch(string1) 
{ 
    case "fruit": 
    return new[] { "apple", "banana" }.Contains(string2); 
    case "meat": 
    return new[] { "beef", "pork" }.Contains(string2); 
    default: 
    return true; 
    break; 
} 

我認爲風格是,在很大程度上,取決於個人品味。這是我的口味......我認爲用數組樣式添加一個新值是很容易的,只需少量開銷(我相信,有人可以隨時糾正我),你可以用數組/樣式的「 if-in「類型檢查。

+0

不太喜歡這個,因爲它每次都會重新創建數組。 – Joel 2010-02-04 23:31:01

+0

@Joel - 是的,但我不知道更短的方式...如果它是一個小列表(我用它),陣列創建仍然比'List '搜索更高性能。它不會比使用帶有'params string [] args'的東西更昂貴...同樣的事情發生。如果用例是一個循環,我同意......當然在外面創建它。 – 2010-02-04 23:52:15

+0

我同意@Joel--我喜歡這個Nick的外觀,但在我的情況下,我將連續這樣做幾次,所以我寧願不要每次都重新創建這個數組。 – Zannjaminderson 2010-02-05 18:43:52

2

是的,還有更好的方法。你想創建一個地圖,它將你的「類別」(「水果」)與你的元素(「蘋果」,「香蕉」等)的字符串列表相關聯。然後你想在上面的例子中查看你的「string1」,看看你的關聯字符串List Contains()是否是你的「string2」。

這使得它完全是數據驅動的,並更加成功地利用了集合的內置功能。

0

你可以做這樣的事情:

Dictionary<string, string> map = new Dictionary<string, string>(); 

map.add("banana", "fruit"); 
map.add("apple", "fruit"); 
map.add("pear", "fruit"); 

map.add("beef", "meat"); 
map.add("pork", "meat"); 


if(map[string2] == string1) 
    return true; 
2

下面是使用LINQ的方式:

Dictionary<string, IList<string>> validValues = new Dictionary<string, IList<string>>() 
{ 
    { "fruit", new List<string>() { "apple", "banana" } }, 
    { "meat", new List<string>() { "pork", "beef" } } 
}; 

if (validValues.FirstOrDefault(x => x.Key == string1 && x.Value.Contains(string2)).Value != null) 
{ 
    return true; 
} 

return false;