2009-11-03 27 views
10

在研究如何將NameValueCollection轉換爲查詢字符串時,我遇到了不同的方法。我很好奇,如果更短的lambda語法是有效的,它可能是。正在使用c#lambda有效性將NameValueCollection轉換爲查詢字符串?

How to convert NameValueCollection to a (Query) String使用迭代函數。

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()); 
} 

Join a NameValueCollection into a querystring in C#使用lambda表達式,這看起來不錯,但我不知道這是否是有效的代碼。

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])))); 
} 

回答

2

首先,你能做的最好的事情是測試,看看性能爲您的應用程序可以接受的,我們可以告訴你泛泛有關性能,但最終只歸結爲您的需要和知道答案。

至於手頭的問題,任何時候你使用一個委託(這是一個lambda創建的)而不是直接執行代碼,你會得到一個性能影響。在大多數情況下,命中率是可以接受的,但如果這段代碼需要絕對最佳性能(比如說它在內部循環中),那麼你需要使用第一種方法。這就是說,如果你正在創建一個查詢字符串,那麼你可能會打到數據庫,這可能比首先創建查詢字符串的任何方法花費的時間要長得多。

11

我會做這樣的:

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; 
} 

你產生更少的對象(即必須由垃圾收集清理)這樣

+0

對於那些(像我)誰在這個偶然的的一般方法從NameValueCollection生成url,這對於具有多個值的參數無法正常工作。提示:遍歷'parameters.GetValues(key)'。 – mcNux 2014-06-12 15:30:53

0

的NameValueCollection的ToString方法將建立查詢字符串爲您。我沒有做過任何基準測試,但我可以想象執行會比使用lambdas或foreach的效率更高效。

(該ToString解決方案似乎並沒有被很好地記載;我只找到它,因爲this answer使用它的代碼示例)。

相關問題