Путь к лексикографическому порядку для словаря пары ключ / значение? - PullRequest
0 голосов
/ 29 февраля 2012

Я пытаюсь заказать мои HeaderParams для создания базы подписей OAuth.

Документы OAuth заявляют это для заказа:

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

Параметры сортируются по имени, используя порядок возрастания значений байтов. Если два или более параметра имеют одно и то же имя, они сортируются по значению.

Так что, если у меня есть C # словарь пар параметров заголовка, как это, как я могу отсортировать это для OAuth?

ОБНОВЛЕНИЕ:

Я считаю, что делать параметрList.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 ]

3 голосов
/ 29 февраля 2012

Словарь не может быть отсортирован.

Однако вы можете получить доступ к ключам отсортированным способом:

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

В качестве альтернативы, вы можете напрямую заказать KeyValuePair и передатьcustom IComparer

2 голосов
/ 29 февраля 2012

Если вам нужно отсортировать словарь по ключу, вы должны использовать 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...