【问题标题】:For Each Dictionary loop in Index order对于索引顺序中的每个字典循环
【发布时间】:2014-06-26 18:51:33
【问题描述】:

我已经尝试使用for 循环和Dictionary,但无法真正实现我想要的。

我有一个特定的变量SomeVariable,我希望我的foreach 能够工作。 SomeVariable可以是1,2,3 or 4

假设SomeVariable1 我想从SomeCollection 内的前3 个索引(0,1,2) 中检索最后一个item.value

如果SomeVariable2,我想从SomeCollection 内的下3 个索引(3,4,5) 中检索最后一个item.value

等等……

For Each item As KeyValuePair(Of String, Integer) In SomeCollection
    If SomeVariable = 1 Then
            //....
    ElseIf SwitchCount = 2 Then
           //....
    End If
Next

【问题讨论】:

  • 字典没有顺序,因此没有可靠的方法来获取“前 3 个”索引。
  • 我确实读过...我想我仍然想尝试一下。
  • 那么您希望如何订购?如果您要订购字典键,我们可以为您提供帮助
  • @TopinFrassi...订购不是问题。幸运的是,它按我想要的方式订购。所以我只需要一些关于代码或其结构的帮助。

标签: vb.net dictionary foreach keyvaluepair


【解决方案1】:

字典没有明确的顺序,所以你感知到的任何顺序都是暂时的。来自MSDN

.KeyCollection 中键的顺序未指定,但它与 Values 属性返回的 .ValueCollection 中的关联值的顺序相同。

尝试使用 Keys 集合来确定顺序表明它是瞬态的:

Dim myDict As New Dictionary(Of Integer, String)

For n As Int32 = 0 To 8
    myDict.Add(n, "foo")
Next

For n As Int32 = 0 To myDict.Keys.Count - 1
    Console.WriteLine(myDict.Keys(n).ToString)
Next

如您所料,输出按顺序打印 0 - 8。那么:

myDict.Remove(5)
myDict.Add(9, "bar")

For n As Int32 = 0 To myDict.Keys.Count - 1
    Console.WriteLine(myDict.Keys(n).ToString)
Next

输出为:0、1、2、3、4、9(!)、6、7、8

如您所见,它重用了旧插槽。任何依赖于某个位置的事物的代码最终都会中断。添加/删除的越多,它就越无序。如果您需要向Dictionary 订购,请改用SortedDictionary

【讨论】:

  • +1。同意。他说无论如何他都想尝试,所以我只是给了他一个答案,但你是对的,因为这是不可取的。
  • 是的,他还说他读到了,我想我会说明为什么这是一个非常糟糕的想法以及如何糟糕。即使它只是一个查找,因为它是“未指定的”,这意味着它可能会在新版本中中断。
  • 因此我 +1。
【解决方案2】:

您不能按索引访问字典,但可以按索引访问键集合。你根本不需要循环。

所以是这样的。

If SomeVariable = 1 Then
    Return SomeCollection(SomeCollection.Keys(2))
ElseIf SomeVariable = 2 Then 
    ...
End If

如果它真的是结构化的,你可以这样做:

Return SomeCollection(SomeCollection.Keys((SomeVariable * 3) - 1))

您可能需要进行一些错误检查并确保字典的长度正确,但这应该会让您走上正轨。

【讨论】:

    【解决方案3】:

    您总是可以使用通用的 SortedDictionary,我只使用 C#,所以这是我的示例:

    SortedDictionary<int,string> dict = new SortedDictionary<int, string>();
    
    foreach( KeyValuePair<int,string> kvp in dict) { ... }
    

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 2011-01-09
      • 2019-04-06
      • 2013-01-04
      • 2015-12-03
      • 2020-04-06
      • 2014-05-04
      • 2019-01-24
      • 1970-01-01
      相关资源
      最近更新 更多