2009-02-12 87 views
0

當前在我的ASP.Net應用程序web.config中,我有一個應用程序設置,它存儲映射值的逗號分隔列表,如下所示。在後面的代碼中,我需要根據輸入值1,2,3進行查找。我可以將字符串拆分並循環,直到找到匹配項,或者使用Regex從配置字符串中提取值。ASP.Net映射值查找

目前我使用正則表達式來獲取映射值。我不反對改變數據在web.config中的存儲方式。有沒有更簡單更優雅的處理方法?

<add key="Mappings" value="1|APP,2|TRG,3|KPK,4|KWT,5|CUT" /> 

回答

1

如果你需要經常使用此查找和web.config中的字符串不經常改變的話,那將字符串解析成Dictionary對象並將其存儲在Application或Cache中是有意義的。

字典中的查找將閃電般快速,特別是與每次解析字符串相比。

private static readonly object _MappingsLock = new object(); 

public static string GetMapping(int id) 
{ 
    // lock to avoid race conditions 
    lock (_MappingsLock) 
    { 
     // try to get the dictionary from the application object 
     Dictionary<int, string> mappingsDictionary = 
      (Dictionary<int, string>)Application["MappingsDictionary"]; 

     if (mappingsDictionary == null) 
     { 
      // the dictionary wasn't found in the application object 
      // so we'll create it from the string in web.config 
      mappingsDictionary = new Dictionary<int, string>(); 

      foreach (string s in mappingsStringFromWebConfig.Split(',')) 
      { 
       string[] a = s.Split('|'); 
       mappingsDictionary.Add(int.Parse(a[0]), a[1]); 
      } 

      // store the dictionary in the application object 
      // next time around we won't need to recreate it 
      Application["MappingsDictionary"] = mappingsDictionary; 
     } 

     // now do the lookup in the dictionary 
     return mappingsDictionary[id]; 
    } 
} 

// eg, get the mapping for id 4 
string mapping = GetMapping(4); // returns "KWT" 
0

拆分上逗號的字符串,然後每串上|,這些存儲在一個字典,通過鍵找到它。

這只是正則表達式的替代方案。你知道他們對Regex的評價。

+0

不,實際上我不知道他們對Regex的評價。爲此使用它不是一個好主意嗎?我認爲Regex是最好的解決方案,因爲不需要初始化數組。 – James 2009-02-13 00:09:03

+0

這真是一個笑話。我在這裏看到的引用是「當你使用正則表達式解決問題時,現在你有兩個問題。」正則表達式版本可能是一個更優雅的解決方案,但如果速度是一個問題,您可以緩存web.config字符串以及字典。 – Moose 2009-02-13 00:23:37

1

只是好奇:)什麼LINQ

string inputValue = "2"; 
string fromConfig = "1|APP,2|TRG,3|KPK,4|KWT,5|CUT";    
string result = fromConfig 
    .Split(',') 
    .Where(s => s.StartsWith(inputValue)) 
    .Select(s => s.Split('|')[1]) 
    .FirstOrDefault(); 

或者

Regex parseRegex = new Regex(@"((?<Key>\d)\|(?<Value>\S{3}),?)"); 
parseRegex.Matches(fromConfig) 
    .Cast<Match>() 
    .Where(m => m.Groups["Key"].Value == inputValue) 
    .Select(m => m.Groups["Value"].Value) 
    .FirstOrDefault();