.NET中将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序)

前言:

将对应集合中的参数按照ASCII码按照从小到大排序,并使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA,其实对于有些参数比较少的而已我们完全可以自己使用固定拼接的方式拼接好来,但是假如参数集合中的参数多达十几个呢?你还是愿意用死方法一个一个的拼接吗?当然我是不愿意的,下面是我在网上的找的一个关于参数ASCII按从小到大排序的例子并结合自己的需求而总结的一个比较好的方法,已经在项目中使用了。.

代码实现:

/// <summary>/// 将参数模型转为按照ASCII码从小到大排序的并且通过键值对的格式拼接而成的字符串如:(stringA="appId=xxxxxx&body=test&merchantId=xxxxx&random=xxxx&key=xxxx")/// </summary>/// <param name="rqData">实例的支付参数模型</param>/// <returns></returns>public string GetParameterAsciiAsc(paymentModel rqData){//rqData为自己实例化的支付参数模型Dictionary<string, string> stringSignTemp = new Dictionary<string, string>();stringSignTemp.Add("appId",rqData.appId.ToString());stringSignTemp.Add("body",rqData.body);stringSignTemp.Add("channel",rqData.channel);stringSignTemp.Add("merchantId",rqData.merchantId.ToString());stringSignTemp.Add("notifyUrl", rqData.notifyUrl);stringSignTemp.Add("outTradeNo", rqData.outTradeNo);stringSignTemp.Add("openId", rqData.openId);stringSignTemp.Add("random",random);stringSignTemp.Add("subject", rqData.subject);stringSignTemp.Add("totalFee",(rqData.totalFee).ToString());//单位为分stringSignTemp.Add("tradeType", rqData.tradeType);
var stringSign=JoinToStrForm(stringSignTemp);
return stringSign;}

/// <summary>/// 将字典集合转化为String类型字符串,并按照参数名ASCII码从小到大排序(字典序)/// </summary>/// <param name="dataPara">字典集合数据</param>/// <returns></returns>public string JoinToStrForm(Dictionary<string, string> dataPara){var parameterAsc= dataPara.OrderBy(x => x.Key, new ComparerString()).ToDictionary(x => x.Key, y => y.Value);//参数按照参数名ASCII码从小到大排序(字典序)List<string> list = new List<string>();foreach (var item in parameterAsc){//通过key,value拼接key=valuelist.Add(item.Key + "=" + item.Value.Replace("#", "").Replace("?", "").Replace("&", "").Replace("=", ""));}
 return string.Join("&", list);}
/// <summary>/// 对象字符串比较/// </summary>private class ComparerString : IComparer<String>{     public int Compare(String x, String y)     {       //将此实例与指定的 <see cref="T:System.String" /> 对象进行比较,并指示此实例在排序顺序中是位于指定的字符串之前、之后还是与其出现在同一位置。       return string.CompareOrdinal(x, y);     }}