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

时间:2014-03-06 15:14:32

标签: vb.net

我有一本字典:

Dim dicItems As Dictionary(of Integer, String)

字典中的项目是:

1,cat
2,dog
3,bird

我希望订单如下:

3,bird
2,dog
1,cat

4 个答案:

答案 0 :(得分:3)

您不能对字典进行排序,而是需要的是排序列表。

Dim dicItems As New SortedList(Of Integer, String)

这将按键值对项目进行排序。如果你想像你的例子那样按降序输出项目,你总是可以从列表末尾开始循环,然后移到开头。

以下链接提供了有关SortedList的更多信息。

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

答案 1 :(得分:2)

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

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语法:

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

答案 2 :(得分:2)

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

作为使用SortedList建议使用IComparer(Of Int32)的Shadows回答的附加组件,您可以使用带有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

{{1}}

答案 3 :(得分:0)

不确定为什么你会这样,因为字典中的项目顺序通常无关紧要,但你可以这样做:

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。如果要替换原始内容,可以执行以下操作:

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

作为该主题的变体,您可以将dicItems.Reverse()替换为其他LINQ替代方案,例如OrderBy,以便您可以按Key,{{1}排序或其组合。例如,此Value给出输出:

dicItems.OrderBy(Function(x) x.Value)

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