如何使用VB.NET以相反的顺序对字典的键进行排序?

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

我有一本字典:

1
Dim dicItems As Dictionary(of Integer, String)

字典中的项目有:

1
2
3
1,cat
2,dog
3,bird

我希望订单是:

1
2
3
3,bird
2,dog
1,cat


你不能对字典排序,你需要的是一个排序列表。

1
Dim dicItems As New SortedList(Of Integer, String)

这将按键值对项目排序。如果您想像您的示例那样按降序取出这些项,那么可以始终从列表的末尾开始执行循环,然后移到开头。

以下链接包含有关SortedList的更多信息。

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


字典没有您可以依赖的隐式顺序("返回项的顺序未定义")。

作为影子的附加组件,建议使用SortedList的答案可以通过使用接受IComparer(Of Int32)的构造函数得到降序:

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

1
2
3
4
5
6
7
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


您可以使用LINQ轻松解决此问题:

1
2
3
4
5
6
7
8
9
10
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

如果需要,还可以使用lambda语法:

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


不知道您为什么要这样做,因为字典中的项目顺序通常不重要,但您可以这样做:

1
2
3
4
5
6
7
8
9
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())

注意,我输出到另一个集合,在本例中是Generic.List。如果要替换原始内容,可以执行以下操作:

1
2
3
4
dicItems.Clear()
For Each kv In dicItemsReversed
  dicItems.Add(kv.Key, kv.Value)
Next

作为主题的变体,您可以用其他LINQ替代品(如OrderBy)替换dicItems.Reverse(),这样您就可以,例如,按KeyValue或其组合排序。例如,dicItems.OrderBy(Function(x) x.Value)给出了以下输出:

1
2
3
3,bird    
1,cat
2,dog

(按值的字母顺序排序,升序)