溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

發(fā)布時(shí)間:2020-08-06 04:37:06 來源:網(wǎng)絡(luò) 閱讀:319 作者:xsster 欄目:網(wǎng)絡(luò)安全

WebAPi常用擴(kuò)展方法

(1)獲取所有鍵值對

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

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

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

 (2)獲取單個(gè)key對應(yīng)value

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

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

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

注意:請不要告訴我用HttpContext.Current.Request.QueryString["key"]去獲取鍵值,在WebHost模式下是可以的,但是在SelfHost模式下該對象是為空的。

(3)獲取請求頭中對應(yīng)鍵值

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

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

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

(4)獲取Cookie中鍵值

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

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

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

思維發(fā)散 

我們知道在ASP.NET中獲取請求參數(shù)值時(shí)用QueryString、在獲取獲取Web.config配置中值時(shí)、以及請求頭中有時(shí)候會(huì)用到NameValueCollection,在上述中我們返回的是Dictionary<string,string>,那Dictionary和NameValueCollection在獲取參數(shù)時(shí)有什么區(qū)別呢?

NameValueCollection 

我們來看看其具體用法,在此類中添加對應(yīng)數(shù)據(jù)并獲?。?/p>

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

        static NameValueCollection GetCollection()
        {            var collection = new NameValueCollection();
            collection.Add("張三", "博客園");
            collection.Add("李四", "csdn");
            collection.Add("李四", "51cto");
            collection.Add("張三", "IBM");            return collection;
        }

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

進(jìn)行打?。?/p>

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

            var collection = GetCollection();            foreach (string key in collection.AllKeys)
            {
                Console.WriteLine(key);
                Console.WriteLine(collection[key]);
            }

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

從上可以看出,此時(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ù)組,若未找到則返回空。

接下來我們看看該集合的其他方法:

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

            Console.WriteLine(collection.HasKeys());

            Console.WriteLine(collection.GetKey(0));            string value = collection.Get(0);

            Console.WriteLine(value);

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

(1)第一個(gè)顯示該集合中是否存在鍵值(返回True)。

(2)獲取該集合的第一個(gè)鍵(返回張三)。

(3)獲取第一鍵對應(yīng)的值(返回博客園,IBM)。

上述都是關(guān)于判斷鍵以及取鍵值的情況,當(dāng)然里面還有添加和移除的方法,添加我們不必多說,我們來看看移除的方法。

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

            collection.Remove("張三");

            collection.Remove("xpy0928");            foreach (var key in collection.AllKeys)
            {
                Console.WriteLine(key);
                Console.WriteLine(collection[key]);
            }

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

當(dāng)移除已存在的鍵時(shí),此時(shí)則會(huì)刪除該鍵對應(yīng)的所有值,但是很有意思的是移除一個(gè)不存在的鍵時(shí)根本不會(huì)拋出異常。

Dictionary

接下來我們看看Dictionary。

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

        static Dictionary<string, string> GetDict()
        {            var dictionary = new Dictionary<string, string>();
            dictionary.Add("張三", "博客園");
            dictionary.Add("李四", "csdn");
            dictionary.Add("王五", "51cto");
            dictionary.Add("趙六", "IBM");            return dictionary;
        }

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

我們添加一項(xiàng)看看

            var dict = GetDict();
            dict.Add("張三", "博客園");

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

在字典中不能添加重復(fù)項(xiàng)。

至此,我們可以得出結(jié)論:在NameValueCollection與Dictionary上最主要的區(qū)別在于NameValueCollection可以添加重復(fù)項(xiàng),而Dictionary不行。

當(dāng)然在字典中去移除不存在的鍵也不會(huì)拋出異常,如下:

  dict.Remove("xpy928");

接下來我們來看看二者在查找數(shù)據(jù)時(shí)是否有性能上的差異,我們在Release模式來進(jìn)行操作。

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

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

WebAPi添加常用擴(kuò)展方法及思維發(fā)散

如上我們迭代10億次來看看二者在查找數(shù)據(jù)上有沒有性能差異:

 WebAPi添加常用擴(kuò)展方法及思維發(fā)散

這里我們可以看到用NameValueCollection去獲取數(shù)據(jù)時(shí)耗時(shí)48秒,而用Dictionary則耗時(shí)4秒,從此可以看出二者除了在添加數(shù)據(jù)上的差異還有在迭代查詢數(shù)據(jù)時(shí)也有很大的性能差異。


向AI問一下細(xì)節(jié)

免責(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)容。

AI