目前在我的ASP.Net应用程序web.config中,我有一个应用程序设置,它存储一个以逗号分隔的映射值列表,如下所示。在后面的代码中,我需要根据输入值1,2,3等对这些数据执行查找。我可以将其拆分并循环直到找到匹配项,或者使用Regex从配置字符串中提取值。
目前我正在使用Regex来获取映射值。我不反对改变数据在web.config中的存储方式。有没有更简单和优雅的方式处理这个?
<add key="Mappings" value="1|APP,2|TRG,3|KPK,4|KWT,5|CUT" />
答案 0 :(得分: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();
答案 1 :(得分: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"
答案 2 :(得分:0)
在逗号上拆分字符串,然后将每个子字符串存储在一个字典中,并按键找到它。
这只是Regex的替代品。你知道他们对Regex的看法。