ASP.Net сопоставления значений поиска - PullRequest
0 голосов
/ 13 февраля 2009

В настоящее время в моих приложениях 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" />

Ответы [ 3 ]

1 голос
/ 13 февраля 2009

Просто любопытно :) А как насчет 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 голос
/ 13 февраля 2009

Если вам нужно часто использовать этот поиск, а строка в web.config меняется не очень часто, то имеет смысл проанализировать строку один раз в объект Dictionary и сохранить ее в приложении или кэше.

Поиск в Словаре будет молниеносным, особенно по сравнению с разбором строки каждый раз.

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 голосов
/ 13 февраля 2009

Разделите строку на запятые, затем каждую подстроку на |, сохраните их в словаре и найдите по ключу.

Это просто альтернатива регулярному выражению. Вы знаете, что они говорят о Regex.

...