我正在尝试订购我的HeaderParams以创建OAuth签名库。
OAuth docs声明了这个命令:
http://tools.ietf.org/html/rfc5849#section-3.4.1.3.2
参数按名称排序,使用升序字节值排序。如果两个或多个参数共享相同的名称,则按值分类。
因此,如果我有像这样的标头参数对的C#字典,我该如何为OAuth排序?
更新:
我相信做一个parameterList.Keys.ToList()。Sort(); “应该”完成我所需要的,只要根据键(键名)按升序排序这个字典。
但是它不起作用,我看到它们在我的排序后仍然出现故障:
oauth_consumer_key, H64HgpIU3bdA4M
oauth_token, rbh4gd0S5GfAXEAF2X
oauth_signature_method, HMAC-SHA1
oauth_timestamp, 1330534605
oauth_nonce, 4207386
它应该是:
oauth_consumer_key, H64HgpIU3bdA4M
oauth_nonce, 4207386
oauth_signature_method, HMAC-SHA1
oauth_timestamp, 1330534605
oauth_token, rbh4gd0S5GfAXEAF2X
答案 0 :(得分:3)
无法对字典进行排序。
但是,您可以按排序方式访问密钥:
IDictionary<string, string> values = //...
var sorted = values.OrderByAscending(kvp => kvp.Key)
foreach (KeyValuePair<string, string> pair in sorted)
//...
或者,您可以直接通过KeyValuePair订购并传递自定义IComparer
答案 1 :(得分:2)
如果您需要按键对字典进行排序,则应使用SortedDictionary。无论如何,因为你可以使用相同的名称,你最好使用这样的List:
List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>();
list.Add(new KeyValuePair<string, string>("b5", "%3D%253D"));
list.Add(new KeyValuePair<string, string>("a3", "a"));
list.Add(new KeyValuePair<string, string>("a3", "%3D%253D"));
list.Sort(Compare);
static int Compare(KeyValuePair<string, string> a, KeyValuePair<string, string> b) {
if (a.Key.CompareTo(b.Key) == 0) {
return a.Value.CompareTo(b.Value);
}
return a.Key.CompareTo(b.Key);
}