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 = queryStrin gs.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[cookie Name].Value; return null;
}
我们知道在ASP.NET中获取请求参数值时⽤QueryString、在获取获取fig配置中值时、以及请求头中有时候会⽤到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++)writeline方法的作用
{ string value = dict["张三"];
} var time1 = stopWatchDict.ElapsedMilliseconds;
Console.WriteLine(time1);
stopWatchDict.Stop();
如上我们迭代10亿次来看看⼆者在查数据上有没有性能差异:
这⾥我们可以看到⽤NameValueCollection去获取数据时耗时48秒,⽽⽤Dictionary则耗时4秒,从此可以看出⼆者除了在添加数据上的差异还有在迭代查询数据时也有很⼤的性能差异。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论