Эффективно ли преобразование 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 решение не кажется хорошо документированным; я нашел его только потому, что ответ использовал его в образце кода.)