Как реорганизовать эти функции, которые имеют одну разницу в строке
У меня есть 3 функции, в которых единственная разница в значениях, которые я указываю с комментарием
//-- point of difference
Большинство функций одинаковы для всех трех. "Сухой" фактор преследует мой сон:). Я размышлял; можно ли их легко и легко объединить?
У меня были такие ситуации, как раньше, и я надеюсь узнать здесь кое-что.
private string RenderRequestType(string render, NameValueCollection nvp, string prefix, string regexWild, string suffix)
{
string regex = prefix + regexWild + suffix;
MatchCollection matches = Regex.Matches(render, regex);
foreach (Match match in matches)
{
foreach (Capture capture in match.Captures)
{
string name = capture.Value.Replace(prefix, "", StringComparison.CurrentCultureIgnoreCase).Replace(suffix, "", StringComparison.CurrentCultureIgnoreCase);
//-- point of difference
string value = nvp[name];
render = render.Replace(capture.Value, value);
}
}
return render;
}
private string RenderSessionType(string render, HttpContext httpContext, string prefix, string regexWild, string suffix)
{
string regex = prefix + regexWild + suffix;
MatchCollection matches = Regex.Matches(render, regex);
foreach (Match match in matches)
{
foreach (Capture capture in match.Captures)
{
string name = capture.Value.Replace(prefix, "", StringComparison.CurrentCultureIgnoreCase).Replace(suffix, "", StringComparison.CurrentCultureIgnoreCase);
//-- point of difference
object session = httpContext.Session[name];
string value = (session != null ? session.ToString() : "");
render = render.Replace(capture.Value, value);
}
}
return render;
}
private string RenderCookieType(string render, HttpContext httpContext, string prefix, string regexWild, string suffix)
{
string regex = prefix + regexWild + suffix;
MatchCollection matches = Regex.Matches(render, regex);
foreach (Match match in matches)
{
foreach (Capture capture in match.Captures)
{
string name = capture.Value.Replace(prefix, "", StringComparison.CurrentCultureIgnoreCase).Replace(suffix, "", StringComparison.CurrentCultureIgnoreCase);
//-- point of difference
HttpCookie cookie = httpContext.Request.Cookies[name];
string value = (cookie != null ? cookie.Value : "");
render = render.Replace(capture.Value, value);
}
}
return render;
}
Ответы
Ответ 1
Вы можете изменить функцию, чтобы выполнить Func<string, string>
, чтобы выполнить поиск:
private string RenderType(string render, Func<string, string> lookupFunc, string prefix, string regexWild, string suffix)
{
string regex = prefix + regexWild + suffix;
MatchCollection matches = Regex.Matches(render, regex);
foreach (Match match in matches)
{
foreach (Capture capture in match.Captures)
{
string name = capture.Value.Replace(prefix, "", StringComparison.CurrentCultureIgnoreCase).Replace(suffix, "", StringComparison.CurrentCultureIgnoreCase);
//-- point of difference
string value = lookupFunc(name);
render = render.Replace(capture.Value, value);
}
}
return render;
}
Затем напишите свои функции в терминах этого, например:
private string RenderRequestType(string render, NameValueCollection nvp, string prefix, string regexWild, string suffix)
{
return RenderType(render, name => nvp[name], prefix, regexWild, suffix);
}
Ответ 2
Перейдите в Func<string, string>
, чтобы получить значение, связанное с заданным именем. В первом случае это будет просто использовать nvp indexer; во втором он будет использовать сеанс. Вы можете использовать отдельные методы для создания делегатов или лямбда-выражения. (Я бы определенно использовал лямбда-выражение для первого, я мог бы использовать отдельный метод для второго.)
Ответ 3
На мой взгляд, лучшим решением является использование лямбда-выражений.
Вместо второго аргумента вашим функциям поставьте lambda, который преобразует string name
в string value
.