2012-02-29 47 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