Преобразует ли NameValueCollection в querystring, используя С# лямбда эффективно?
При исследовании того, как преобразовать NameValueCollection в querystring, я столкнулся с различными методами. Мне любопытно, если более короткий лямбда-синтаксис настолько эффективен, насколько это возможно.
Как преобразовать NameValueCollection в строку (Query) с помощью функции итерации.
public static String ConstructQueryString(NameValueCollection parameters)
{
List<String> items = new List<String>();
foreach (String name in parameters)
items.Add(String.Concat(name, "=", System.Web.HttpUtility.UrlEncode(parameters[name])));
return String.Join("&", items.ToArray());
}
Присоединиться к NameValueCollection в querystring в С# использует выражение лямбда, которое выглядит хорошо, но я не уверен, что это эффективный код.
private static string JoinNvcToQs(NameValueCollection qs)
{
return string.Join("&", Array.ConvertAll(qs.AllKeys, key => string.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(qs[key]))));
}
Ответы
Ответ 1
Прежде всего, самое лучшее, что вы можете сделать, это проверить и проверить, приемлема ли производительность для вашего приложения, мы можем рассказать вам об особенностях производительности, но в конце концов это сводится к вашим потребностям, и только вы знаете ответы на что.
Что касается вопроса о том, что каждый раз, когда вы используете делегат (который создается лямбдой), а не выполняете код напрямую, вы получаете удар производительности. В большинстве случаев хит является приемлемым, но если этот код нуждается в абсолютной максимальной производительности (скажем, во внутреннем цикле), вам нужно перейти к первому методу.
Тем не менее, если вы создаете querystring, предположительно, вы собираетесь попасть в базу данных, которая, вероятно, займет значительно больше времени, чем любой способ создания запроса. В первую очередь.
Ответ 2
Я бы сделал это следующим образом:
public static string ConstructQueryString(NameValueCollection parameters)
{
var sb = new StringBuilder();
foreach (String name in parameters)
sb.Append(String.Concat(name, "=", System.Web.HttpUtility.UrlEncode(parameters[name]), "&"));
if (sb.Length > 0)
return sb.ToString(0, sb.Length - 1);
return String.Empty;
}
Таким образом вы создаете меньше объектов (которые должны быть очищены сборщиком мусора)
Ответ 3
Метод NameValueCollection ToString
построит для вас строку запроса. Я не проводил бенчмаркинга, но я бы предположил, что реализация будет более эффективной, чем что-либо, используя lambdas или foreach.
(Решение ToString
, похоже, не документировано, я нашел его только потому, что этот ответ использовал его в образце кода.)