2012-02-29 2 views
0

J'essaye de commander ma HeaderParams pour la création de base de signature d'OAuth.Chemin de l'ordre lexicographique pour Dictionnaire Clés/paires de valeurs?

Les docs OAuth pour l'indiquer les commander:

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

Les paramètres sont classés par nom, en utilisant la commande de valeur d'octet ascendant. Si deux ou plusieurs paramètres partagent le même nom, ils sont triés par leur valeur.

Donc, si j'ai un C# dictionnaire des paires de paramètres d'en-tête comme ceci, comment puis-je trier cela pour OAuth? .

MISE À JOUR:

Je crois faire un parameterList.Keys.ToList() Trier(); "devrait" accomplir ce dont j'ai besoin pour trier ce dictionnaire dans l'ordre croissant en fonction de la clé (nom de la clé).

Mais cela ne fonctionne pas, je vois les params hors d'usage encore après frappe mon genre ici:

oauth_consumer_key, H64HgpIU3bdA4M 
oauth_token, rbh4gd0S5GfAXEAF2X 
oauth_signature_method, HMAC-SHA1 
oauth_timestamp, 1330534605 
oauth_nonce, 4207386 

il devrait être:

oauth_consumer_key, H64HgpIU3bdA4M 
oauth_nonce, 4207386 
oauth_signature_method, HMAC-SHA1 
oauth_timestamp, 1330534605 
oauth_token, rbh4gd0S5GfAXEAF2X 

Répondre

3

Un dictionnaire ne peut pas être triée.

Cependant, vous pouvez accéder aux clés de manière triée:

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

Vous pouvez commander par le KeyValuePair directement et passer une coutume IComparer

+0

ce que vous entendez par foreach (KeyValuePair paire dans Sorted) – PositiveGuy

2

Si vous devez trier un dictionnaire par clé vous devriez utiliser un SortedDictionary. Quoi qu'il en soit, puisque vous pourriez avoir le même nom que vous feriez mieux d'utiliser une liste comme ceci:

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

Je ne sais pas si cela aussi Le tri répond aux exigences de tri dans OAuth. Il est difficile de dire quelle partie du problème est la création de la sorte en premier lieu. – PositiveGuy

Questions connexes