2012-02-29 7 views
0

OAuth署名ベース作成のために私のHeaderParamsを注文しようとしています。ディクショナリキー/値のペアの辞書順ですか?

のOAuthのドキュメントは、それらを注文するためにこれを述べる:

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

パラメータが上昇バイト値の順序付けを使用して、名前でソートされています。 2つ以上のパラメータが同じ名前を共有する場合、それらの値によってソートされます。

このようにC#辞書のヘッダーパラメータペアを使用している場合、これをどのようにOAuthで並べ替えることができますか?

更新日:

を私はparameterList.Keys.ToListを(やって信じて)ソート();。この辞書をKey(Key Name)に基づいて昇順に並べ替える限り、必要なものを達成する必要があります。

しかし、それは働いていない、それはここに私の並べ替えに当たった後、私はまだ順不同での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で注文すると、あなたがキーによって辞書をソートする必要がある場合は

+0

この場合は、foreachのことで(KeyValuePairソート中のにペア) – PositiveGuy

2

たIComparerのカスタムを渡すことができます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

関連する問題