【问题标题】:Dictionary in VB.NET obtain keys groupedVB.NET中的字典获取分组的键
【发布时间】:2012-06-09 14:55:55
【问题描述】:

你好,我有这本词典..

Dim Rooms As New Dictionary(Of Integer, Of Integer)

Rooms(1) = 101, 102, 109, 110
Rooms(2) = 103, 104, 105
Rooms(3) = 106, 107

我想知道我是否可以获得字典中有多少键

例如,在这本字典中,我有 3 个键,如果我使用 Rooms.Count,它会返回 9 个,即每对键值对,但我想获得 3 个,每个不同的值作为键。

编辑:Sintax 错误 P.D:我现在不能使用,因为我必须在按 IP 过滤的 Web 服务中使用,但是 VS2010 如果我在字典上使用计数,会告诉我将包含键/值对的数量。

【问题讨论】:

  • 字典键必须是唯一的,我希望这在运行时会失败。我认为字典不适合您的需求。
  • 在上一个示例中,您只有 3 个键,而不是 9 个。而且您不能使用该语法来设置值。 Dictionary(Of Integer, Integer) 中的每个键只有一个值,不是 4,3,2
  • 是的,是一个更复杂的sintax,但我用这个就像一个简单的例子,我必须使用一个字符串字典,字典(整数,列表)

标签: vb.net count


【解决方案1】:

如果您在谈论System.Collections.Generic.Dictionary(Of TKey, Of TValue),您的代码将抛出ArgumentException,因为您要多次添加相同的密钥。

如果您改用索引器,它仍然无法工作:

Rooms(1) = 101
Rooms(1) = 102
...

这样,不会有异常,但是第二行只会覆盖第一行中存储的值。

看来您实际上想使用Dictionary(Of Integer, Of List(Of Integer))。像这样使用它:

Dim Rooms = Rooms As Dictionary(Of Integer, Of List(Of Integer))

Rooms(1) = New List(Of Integer) From { 101, 102, 109, 110 }
Rooms(2) = New List(Of Integer) From { 103, 104, 105 }
Rooms(3) = New List(Of Integer) From { 106, 107 }

Rooms.Count 然后会为您提供字典中的键数。

当且仅当您的每个键的列表的长度以后不改变时,您可以使用数组而不是 List(Of Integer) 实例。

【讨论】:

  • 对不起,我把想法写成了一个列表。在这种情况下是这样的 Rooms(1) = 101, 102, 109, 110 Rooms(2) = 103, 104, 105 Rooms(3) = 106, 107 我怎么知道钥匙的数量是多少? 3 在这种情况下.. 谢谢和抱歉。
  • 如果您使用Dictionary(Of Integer, Of List(Of Integer)),则字典的Count 属性实际上会返回您要查找的键的数量。
  • 确定吗? VS2010告诉我这是对的数量,而不是不同键的数量,我现在无法测试..谢谢。
  • Dictionary(Of Integer, Of List(Of Integer)) 中,有两个值对,一个是Integer,另一个是List(Of Integer)。每个添加的密钥都有一对这样的密钥,每个密钥最多可以添加一次。因此,Count 是键的数量。
【解决方案2】:

如果将相同的键添加到字典中,则会出现异常。如果这是一个键值对列表,您可以使用 groupby linq 运算符

    Dim rooms = New List(Of KeyValuePair(Of String, String))()

rooms.Add(New KeyValuePair(Of String, String)("one", "thing1"))
rooms.Add(New KeyValuePair(Of String, String)("one", "thing2"))
rooms.Add(New KeyValuePair(Of String, String)("two", "other1"))
rooms.Add(New KeyValuePair(Of String, String)("two", "other2"))

Dim query = rooms.GroupBy(Function(x) x.Key)
For Each g As var In query
    Console.WriteLine("Key: " & Convert.ToString(g.Key))
    For Each v As var In g
        Console.WriteLine(vbTab & Convert.ToString(v.Value))
    Next
Next

【讨论】:

    【解决方案3】:

    请看我对 SO 问题 c# dictionary How to add multiple values for single key? 的回答,我在其中展示了我对多地图的实现。这基本上是一个带有列表条目的字典。它允许您存储每个键的值列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      相关资源
      最近更新 更多