简体   繁体   中英

How to sort the keys of a dictionary in reverse order using VB.NET?

I have a dictionary:

Dim dicItems As Dictionary(of Integer, String)

The items in the dictionary are:

1,cat
2,dog
3,bird

I would like the order to be:

3,bird
2,dog
1,cat

You can't sort a dictionary, what you need is a sorted list instead.

Dim dicItems As New SortedList(Of Integer, String)

This will sort the items by the key value. If you want to get the items out in descending order like your example you could always do a loop starting from the end of the list, and moving to the beginning.

The below link has more information on SortedList's.

http://msdn.microsoft.com/en-us/library/ms132319%28v=vs.110%29.aspx

You can use LINQ to solve this easily:

Dim dicItems As New Dictionary(Of Integer, String)
With dicItems
  .Add(1, "cat")
  .Add(2, "dog")
  .Add(3, "bird")
End With

dim query = from item in dicItems
            order by item.Key descending
            select item

If you want, you can also use the Lambda syntax:

Dim query = dicItems.OrderByDescending(Function(item) item.Key)

A dictionary has no implicit order that you can rely on ("The order in which the items are returned is undefined").

As add-on for Shadows answer who suggest to use a SortedList you can get descending order by using the constructor that takes an IComparer(Of Int32) :

Dim list = New SortedList(Of Integer, String)(New DescendingComparer())
list.Add(3, "bird")
list.Add(1, "cat")
list.Add(2, "dog")

Public Class DescendingComparer
    Implements IComparer(Of Int32)

    Public Function Compare(x As Integer, y As Integer) As Integer Implements System.Collections.Generic.IComparer(Of Integer).Compare
        Return y.CompareTo(x)
    End Function
End Class

Not sure why you would want to, since an order of items in the dictionary usually does not matter, but you can do it like this:

Dim dicItems As New Dictionary(Of Integer, String)
With dicItems
  .Add("1", "cat")
  .Add("2", "dog")
  .Add("3", "bird")
End With

Dim dicItemsReversed As New List(Of KeyValuePair(Of Integer, String))
dicItemsReversed.AddRange(dicItems.Reverse())

Notice that I output to a different collection, ie Generic.List in this case. If you want to replace your original contents, you can then do this:

dicItems.Clear()
For Each kv In dicItemsReversed
  dicItems.Add(kv.Key, kv.Value)
Next

As a variation on the topic, you can replace dicItems.Reverse() with other LINQ alternatives, such as OrderBy , so you can, for example, sort by Key , Value or a combination thereof. For example this dicItems.OrderBy(Function(x) x.Value) gives the output of:

3,bird    
1,cat
2,dog

(sorted alphabetically by value, ascending order)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM