2012-06-07 77 views
0

我新手在下面的代碼.NET我已經寫了,首先需要關鍵字轉換爲大寫&後,如果其他ladder.Just檢查correctness.here是我的代碼,大寫字母的,如果別的laddder

private string toupper(string keyword) 
    { 
     newkeyword = keyword.ToUpper(); 

     return newkeyword; 
    } 

    private string check(String newkeyword) 
    { 
     if (newkeyword == SETTELG || SETTHJORT) 
     { 
      Response.Redirect("../SMSFunction/SeenSMS.ascx"); 
     } 
     else if (newkeyword==SKUTTELG || SKUTTHJORT) 
     { 
      Response.Redirect("../SMSFunction/ShotSMS.ascx"); 
     } 

     else if (newkeyword == RUNDBALL) 
     { 
      Response.Redirect("../SMSFunction/RoundballSMS.ascx"); 
     } 
    } 
+0

此代碼甚至不會編譯剛走了一個可能的情況下,價值就像我得到,如果我有一個不完整的模式在F#的匹配,但是這並不一定可能的交換機。 – leppie

+0

switch語句將是一個有效的替代構造在那裏使用。而你的方法不會在任何代碼路徑中返回一個值。 –

+0

對於你需要先諮詢編譯器的正確性,那麼你可以在這裏發佈 – V4Vendetta

回答

1
private void Check(string keyword) 
    { 
     switch(keyword.ToUpper()) 
     { 
      case "SETTELG ": 
      case "SETTHJORT": 
       Response.Redirect("../SMSFunction/SeenSMS.ascx"); 
       break; 
       /*remaining code*/ 
     } 
    } 

讓它如下...

2

StringDictionary不區分大小寫,這樣就可以避免上/下 - 這樣的

readonly StringDictionary redirects = new StringDictionary { 
    {SETTELG, "../SMSFunction/SeenSMS.ascx"}, 
    {SETTHJORT, "../SMSFunction/SeenSMS.ascx"}, 
    {SKUTTELG, "../SMSFunction/ShotSMS.ascx"}, 
    {SKUTTHJORT, "../SMSFunction/ShotSMS.ascx"}, 
    {RUNDBALL, "../SMSFunction/RoundballSMS.ascx"}, 
}; 

然後只是:

var path = redirects[keyword]; 
if(path != null) Response.Redirect(path); 
+0

是'StringDictionary'最好的通用'Dictionary'與'StringComparer.xxxIgnoreCase',或者是有沒有多少呢? – Rawling

+0

@rawling我想剩下的唯一考慮就是OP的有效技能水平,它使用字典初始化語法,這也可能需要解釋。 –

+0

@Rawling唯一的區別是我能想到的是你是否需要它來實現'IDictionary '('StringDictionary'沒有)。我選擇它的唯一原因是爲了避免在答案中增加泛型,以防複雜性增加。 –

1

當涉及到關鍵字和其他(域)衆所周知的字符串值我個優選使用某種解析。在您的特定情況下,我可能會定義一個枚舉

public enum Keywords { 
    SettleLG, 
    SettHjort, 
    SkutteLG, 
    SkuttHjort, 
    RundBall  
} 

,那麼你可以解析的關鍵詞

//Note this will (deliberately) throw an exception 
//if the string does not match a defined value 
//depending on your needs you might want to handle that 
var parsedKeyword = (Keywords)Enum.Parse(typeof(Keywords),keyword,true); 

有了到位,那麼你可以寫一個開關

private string GetRelativUrlFromKeyword(Keywords parsedKeyword){ 
    switch(parsedKeyword) 
     case Keywords.SetteLG: 
     case Keywords.SettHjort: 
     return "../SMSFunction/SeenSMS.ascx"; 
     case Keywords.SkutteLG: 
     case Keywords.SkuttHjort: 
     return "../SMSFunction/ShotSMS.ascx"; 
     case KeyWords.RundBall: 
     return "../SMSFunction/RoundballSMS.ascx"; 
     default: 
     throw new InvalidOperationException("Keyword not recognized" + parsedKeyword); 
} 

把它所有在一起你的電話代碼會看起來像這樣

var parsedKeyword = (Keywords)Enum.Parse(typeof(Keywords),keyword); 
var relativeUrl = GetRelativUrlFromKeyword(parsedKeyword); 
Response.Redirect(relativeUrl,true); 

通過解析值作爲枚舉也驗證值(1),這將使它更容易追捕與傳遞不正確的值的代碼的其他部分的錯誤。 如果您希望在一組值和另一組值之間使用硬編碼映射(如在關鍵字和相對URL之間的情況下),則開關構造工作正常。

我在一個單獨的功能,因爲它使代碼更容易推理時,每個函數/方法做一件事拆分映射出。 交換機中的默認情況會引發異常。當你添加一個新的關鍵字,但忘記在交換機中處理它時,這會被捕獲。你可以選擇其他的默認值。我通常喜歡在默認情況下拋出異常,因爲在更改代碼的其他部分時,我忘記了執行某些操作。 (2)。我還在你的response.redirect中添加了一個bool(true),它告訴框架你已經完成了響應,並且它可以將它發送給客戶端(這是微不足道的,但我更願意將我的代碼作爲顯式的可能,當涉及到代碼的意圖。)

(1)如果你可以得到沒有關鍵字字符串讓我知道,我可以顯示你將如何使用TryParse而不是 (2)我會很喜歡有一個編譯器警告,如果我(使用字符串這不是當EG)

+0

爲了得到所需的不區分大小寫的行爲,你可能需要在'Enum.Parse'上調用'false' –

+0

@MarcGravell謝謝更正 –

+0

我真的很抱歉 - 我的錯,參數是'ignoreCase',所以應該' TRUE'。哎呀。 –