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