您好,登錄后才能下訂單哦!
/// <summary> /// 獲取所有鍵值 /// </summary> /// <param name="request"></param> /// <returns></returns> public static Dictionary<string, string> GetQueryStrings(this HttpRequestMessage request) { return request.GetQueryNameValuePairs().ToDictionary(k => k.Key, v => v.Value, StringComparer.OrdinalIgnoreCase); }
/// <summary> /// 獲取單個(gè)鍵值 /// </summary> /// <param name="request"></param> /// <param name="key"></param> /// <returns></returns> public static string GetQueryString(this HttpRequestMessage request, string key) { var queryStrings = request.GetQueryNameValuePairs(); if (queryStrings == null) return null; var match = queryStrings.FirstOrDefault(kv => string.Compare(kv.Key, key, true) == 0); if (string.IsNullOrEmpty(match.Value)) return null; return match.Value; }
注意:請不要告訴我用HttpContext.Current.Request.QueryString["key"]去獲取鍵值,在WebHost模式下是可以的,但是在SelfHost模式下該對象是為空的。
/// <summary> /// 依據(jù)鍵獲取請求頭中值數(shù)據(jù) /// </summary> /// <param name="request"></param> /// <param name="key"></param> /// <returns></returns> public static string GetHeader(this HttpRequestMessage request, string key) { IEnumerable<string> keys = null; if (!request.Headers.TryGetValues(key, out keys)) return null; return keys.First(); }
/// <summary> /// 獲取Cookie /// </summary> /// <param name="request"></param> /// <param name="cookieName"></param> /// <returns></returns> public static string GetCookie(this HttpRequestMessage request, string cookieName) { CookieHeaderValue cookie = request.Headers.GetCookies(cookieName).FirstOrDefault(); if (cookie != null) return cookie[cookieName].Value; return null; }
我們知道在ASP.NET中獲取請求參數(shù)值時(shí)用QueryString、在獲取獲取Web.config配置中值時(shí)、以及請求頭中有時(shí)候會(huì)用到NameValueCollection,在上述中我們返回的是Dictionary<string,string>,那Dictionary和NameValueCollection在獲取參數(shù)時(shí)有什么區(qū)別呢?
我們來看看其具體用法,在此類中添加對應(yīng)數(shù)據(jù)并獲?。?/p>
static NameValueCollection GetCollection() { var collection = new NameValueCollection(); collection.Add("張三", "博客園"); collection.Add("李四", "csdn"); collection.Add("李四", "51cto"); collection.Add("張三", "IBM"); return collection; }
進(jìn)行打?。?/p>
var collection = GetCollection(); foreach (string key in collection.AllKeys) { Console.WriteLine(key); Console.WriteLine(collection[key]); }
從上可以看出,此時(shí)的鍵沒有重復(fù)返回,但是此時(shí)每一個(gè)鍵會(huì)映射到一個(gè)字符串?dāng)?shù)組即里面存的是相同的鍵所對應(yīng)的值。所以我們可以得出結(jié)論通過AllKeys屬性來進(jìn)行遍歷NameValueCollection集合時(shí)此時(shí)返回的鍵是所有未重復(fù)的鍵。
此時(shí)我們?nèi)羧∧硞€(gè)不存在的鍵結(jié)果會(huì)是怎樣呢?
Console.WriteLine(collection["xpy0928"] == null);
此時(shí)會(huì)打印出True。
基于此我們可以得出結(jié)論:
當(dāng)在NameValueCollection集合中依據(jù)鍵去取值時(shí),若有多個(gè)值被找到,此時(shí)則會(huì)返回以逗號(hào)隔開的字符串?dāng)?shù)組,若未找到則返回空。
接下來我們看看該集合的其他方法:
Console.WriteLine(collection.HasKeys()); Console.WriteLine(collection.GetKey(0)); string value = collection.Get(0); Console.WriteLine(value);
(1)第一個(gè)顯示該集合中是否存在鍵值(返回True)。
(2)獲取該集合的第一個(gè)鍵(返回張三)。
(3)獲取第一鍵對應(yīng)的值(返回博客園,IBM)。
上述都是關(guān)于判斷鍵以及取鍵值的情況,當(dāng)然里面還有添加和移除的方法,添加我們不必多說,我們來看看移除的方法。
collection.Remove("張三"); collection.Remove("xpy0928"); foreach (var key in collection.AllKeys) { Console.WriteLine(key); Console.WriteLine(collection[key]); }
當(dāng)移除已存在的鍵時(shí),此時(shí)則會(huì)刪除該鍵對應(yīng)的所有值,但是很有意思的是移除一個(gè)不存在的鍵時(shí)根本不會(huì)拋出異常。
接下來我們看看Dictionary。
static Dictionary<string, string> GetDict() { var dictionary = new Dictionary<string, string>(); dictionary.Add("張三", "博客園"); dictionary.Add("李四", "csdn"); dictionary.Add("王五", "51cto"); dictionary.Add("趙六", "IBM"); return dictionary; }
我們添加一項(xiàng)看看
var dict = GetDict(); dict.Add("張三", "博客園");
在字典中不能添加重復(fù)項(xiàng)。
至此,我們可以得出結(jié)論:在NameValueCollection與Dictionary上最主要的區(qū)別在于NameValueCollection可以添加重復(fù)項(xiàng),而Dictionary不行。
當(dāng)然在字典中去移除不存在的鍵也不會(huì)拋出異常,如下:
dict.Remove("xpy928");
接下來我們來看看二者在查找數(shù)據(jù)時(shí)是否有性能上的差異,我們在Release模式來進(jìn)行操作。
var collection = GetCollection(); var dict = GetDict(); var stopWatch = new Stopwatch(); stopWatch.Start(); for (int i = 0; i < 100000000; i++) { string value = collection["張三"]; } var time = stopWatch.ElapsedMilliseconds; Console.WriteLine(time); stopWatch.Stop(); var stopWatchDict = new Stopwatch(); stopWatchDict.Start(); for (int i = 0; i < 100000000; i++) { string value = dict["張三"]; } var time1 = stopWatchDict.ElapsedMilliseconds; Console.WriteLine(time1); stopWatchDict.Stop();
如上我們迭代10億次來看看二者在查找數(shù)據(jù)上有沒有性能差異:
這里我們可以看到用NameValueCollection去獲取數(shù)據(jù)時(shí)耗時(shí)48秒,而用Dictionary則耗時(shí)4秒,從此可以看出二者除了在添加數(shù)據(jù)上的差異還有在迭代查詢數(shù)據(jù)時(shí)也有很大的性能差異。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。