/// <summary>  &n"/>

WebAPi添加常用扩展方法及思维发散

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebAPi添加常用扩展方法及思维发散相关的知识,希望对你有一定的参考价值。

WebAPi常用扩展方法

(1)获取所有键值对

技术分享

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

技术分享

 (2)获取单个key对应value

技术分享

         /// <summary>
        /// 获取单个键值        /// </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模式下该对象是为空的。

(3)获取请求头中对应键值

技术分享

        /// <summary>
        /// 依据键获取请求头中值数据        /// </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();
        }

技术分享

(4)获取Cookie中键值

技术分享

         /// <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中获取请求参数值时用QueryString、在获取获取Web.config配置中值时、以及请求头中有时候会用到NameValueCollection,在上述中我们返回的是Dictionary<string,string>,那Dictionary和NameValueCollection在获取参数时有什么区别呢?

NameValueCollection 

我们来看看其具体用法,在此类中添加对应数据并获取:

技术分享

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

技术分享

进行打印:

技术分享

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

技术分享

技术分享

从上可以看出,此时的键没有重复返回,但是此时每一个键会映射到一个字符串数组即里面存的是相同的键所对应的值。所以我们可以得出结论通过AllKeys属性来进行遍历NameValueCollection集合时此时返回的键是所有未重复的键。

此时我们若取某个不存在的键结果会是怎样呢?

 Console.WriteLine(collection["xpy0928"] == null);

此时会打印出True。

基于此我们可以得出结论:

当在NameValueCollection集合中依据键去取值时,若有多个值被找到,此时则会返回以逗号隔开的字符串数组,若未找到则返回空。

接下来我们看看该集合的其他方法:

技术分享

            Console.WriteLine(collection.HasKeys());

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

            Console.WriteLine(value);

技术分享

(1)第一个显示该集合中是否存在键值(返回True)。

(2)获取该集合的第一个键(返回张三)。

(3)获取第一键对应的值(返回博客园,IBM)。

上述都是关于判断键以及取键值的情况,当然里面还有添加和移除的方法,添加我们不必多说,我们来看看移除的方法。

技术分享

            collection.Remove("张三");

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

技术分享

技术分享

当移除已存在的键时,此时则会删除该键对应的所有值,但是很有意思的是移除一个不存在的键时根本不会抛出异常。

Dictionary

接下来我们看看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;
        }

技术分享

我们添加一项看看

            var dict = GetDict();
            dict.Add("张三", "博客园");

技术分享

在字典中不能添加重复项。

至此,我们可以得出结论:在NameValueCollection与Dictionary上最主要的区别在于NameValueCollection可以添加重复项,而Dictionary不行。

当然在字典中去移除不存在的键也不会抛出异常,如下:

  dict.Remove("xpy928");

接下来我们来看看二者在查找数据时是否有性能上的差异,我们在Release模式来进行操作。

技术分享

            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亿次来看看二者在查找数据上有没有性能差异:

 技术分享

这里我们可以看到用NameValueCollection去获取数据时耗时48秒,而用Dictionary则耗时4秒,从此可以看出二者除了在添加数据上的差异还有在迭代查询数据时也有很大的性能差异。


以上是关于WebAPi添加常用扩展方法及思维发散的主要内容,如果未能解决你的问题,请参考以下文章

思维的发散

善用思维导图来整理发散的思维

64求1+2+3+...+n(发散思维能力 )

剑指offer-面试题64-求1+2+...+n-发散思维

收敛和发散思维如何被用作解决问题的手段

电脑上思维导图怎么做