Эффективно ли преобразование NameValueCollection в строку запроса с использованием лямбды c#?
исследуя, как преобразовать NameValueCollection в querystring, я столкнулся с различными методами. Мне любопытно, насколько эффективен более короткий синтаксис лямбда-кода.
как преобразовать NameValueCollection в строку (запрос) использование итерационной функции.
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 к строке запроса в C# использует лямбда-выражение, которое выглядит хорошо, но я не уверен, если это эффективно код.
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]))));
}
3 ответов
прежде всего, лучшее, что вы можете сделать, это проверить и посмотреть, приемлема ли производительность для вашего приложения, мы можем рассказать вам общие сведения о производительности, но в конце концов это сводится к вашим потребностям, и только вы знаете ответы на это.
Что касается вопроса, то в любое время, когда вы используете делегат (который создает лямбда), а не выполняете код напрямую, вы получите удар по производительности. В большинстве случаев попадание приемлемо, но если этот код нуждается в абсолютная наилучшая производительность (скажем, во внутреннем цикле), тогда вам нужно пойти с вашим первым методом.
тем не менее, если вы создаете строку запроса, предположительно, вы собираетесь попасть в базу данных, которая, вероятно, займет значительно больше времени, чем любой из методов создания строки запроса в первую очередь.
Я бы сделал так:
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;
}
таким образом, Вы создавать меньше объектов (которые должны быть очищены сборщиком мусора)
NameValueCollection в ToString
метод построит строку запроса для вас. Я не делал никаких бенчмаркингов, но я бы предположил, что реализация будет более эффективной, чем что-то с использованием lambdas или foreach.
(том ToString
решение не кажется хорошо документированным; я нашел его только потому, что ответ использовал его в образце кода.)