2017-01-15 19 views
1

私は辞書を持っています。辞書の順番変更

Dictionary<int, string> inboxMessages = new Dictionary<int, string>(); 

この辞書には、独自の固有ID(メッセージが新しいほど、IDが高い)が含まれています。メッセージをピッカー(xamarin)に入れますが、最も古いメッセージが最初に表示されます。これをどうやって変更できますか?

ピッカー:私は私のメッセージを取得する方法

inboxPicker = new Picker 
     { 
      WidthRequest = 320, 
     }; 
     foreach (string inboxMessage in inboxMessages.Values) 
     { 
      inboxPicker.Items.Add(inboxMessage); 
     } 

は:

 private async Task getMessages() 
    { 
     await Task.Run(async() => { 
      MailModel[] mails = await api.GetMails(App.userInfo.user_id); 

      foreach (MailModel mail in mails) 
      { 
       inboxMessages.Add(mail.message_id,mail.sender_user_id +" "+ mail.subject +" "+ mail.time_send); 
      } 
     }); 
    } 

答えて

1

あなたはまだ彼らの鍵へのアクセスを持っていながら、あなたは辞書エントリをソートする必要があります

foreach (string inboxMessage in inboxMessages 
    .OrderByDescending(m => m.Key) 
    .Select(m => m.Value) 
{ 
    inboxPicker.Items.Add(inboxMessage); 
} 
+0

これは動作しますが、(m => m.Value)である必要があります) – JeroenM

2

辞書のValues propertyを注文されていません。引用のドキュメントから:あなたは、いくつかの特定の順序で値を取得したい場合は

Dictionary<TKey, TValue>.ValueCollection内の値の順序が指定されていない[...]

、あなたはそれを自分でソートする必要があります。例えば:

var sorted = inboxMessages.OrderByDescending(kv => kv.Key).Select(kv => kv.Value); 

foreach (string inboxMessage in sorted) 
{ 
    inboxPicker.Items.Add(inboxMessage); 
} 

これは、辞書からKeyValuePairsを取得し、そのintキーに降順それらをソートした後の値の列挙を返します。

+0

それは辞書OrderByDescの定義が含まれていないことを言います。 – JeroenM

+0

@JeroenM:Typoは、 'OrderByDescending'である必要があります。ありがとう、固定。 – Heinzi

+0

あなたとC.Evenhuisの両方の回答が働きます。それが最初に働いたので最初に他を受け入れました。しかし、両方の答えが仕事をしています。ありがとう!私はあなたがもう少し説明したことが好きであることを認めなければならない。 – JeroenM