字典键/值对的词典顺序方式?

时间:2012-02-29 07:36:32

标签: c# .net oauth

我正在尝试订购我的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 

2 个答案:

答案 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);
    }