2012-02-29 124 views
0

我试图订购我的HeaderParams以创建OAuth签名基础。字典键/值对的字典顺序的方法?

基于OAuth的认证文档说明此为命令他们:

http://tools.ietf.org/html/rfc5849#section-3.4.1.3.2

的参数按名称排序,使用上升字节值排序。如果两个或多个参数共享相同的名称,则按照它们的值排序。

因此,如果我有一个C#字典像这样的头部参数对,我该如何对OAuth进行排序呢? 。

更新:

我相信做一个parameterList.Keys.ToList()排序(); “应该”根据键(键名)按照升序对字典进行排序来完成我所需要的操作。

但它不工作,我看到了PARAMS失灵在这里打我的排序还是后:

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 

回答

3

字典不能进行排序。另外

IDictionary<string, string> values = //... 
var sorted = values.OrderByAscending(kvp => kvp.Key) 
foreach (KeyValuePair<string, string> pair in sorted) 
    //... 

,您可以通过KeyValuePair直接订购,并通过自定义的Icomparable

+0

那你的意思是的foreach(KeyValuePair <字符串,字符串>按排序对) – PositiveGuy 2012-02-29 19:12:12

2

如果需要排序键的字典:

但是,您可以访问关键的排序方式你应该使用SortedDictionary。无论如何,因为你可以有相同的名字,你最好使用像这样的列表:

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); 
    } 
+0

我也不知道这排序符合OAuth中的排序要求。很难说哪一个是问题的一部分,首先就是创建这种排序。 – PositiveGuy 2012-02-29 16:35:01