VB.Net中如何实现同时存储字符串与整数的列表和字典
VB.Net 实现列表/字典混合存储数值与字符串类型的方案
VB.Net 作为强类型语言,默认泛型List(Of T)、Dictionary(Of TKey, TValue)确实要求预先指定固定的元素存储类型,无法直接像Python那样无声明存入混合类型数据,但不需要拆分两个独立列表增加逻辑复杂度,有三种成熟方案可以实现你需要的混合存储效果,完全适配DND战役工具的开发场景。
方案1:指定元素类型为Object(最贴近Python动态列表的实现)
.Net中所有值类型(数值、布尔值等)、引用类型(字符串等)都继承自Object基类,直接将列表/字典的元素类型声明为Object,即可存入任意类型数据,逻辑和你给出的Python示例完全一致。
' 混合类型列表示例,等价于Python的lst = [1, 2, "a", "b"] Dim lst As New List(Of Object) From {1, 2, "a", "b"} ' 取值输出结果为2,和Python逻辑一致 Console.WriteLine(lst(1))
字典场景也可以用同样方式声明,适配你存储DND战役属性的需求:
' 混合类型字典型示例 Dim dndCampaignData As New Dictionary(Of String, Object) From { {"CampaignTitle", "幽暗地域深渊远征"}, {"PlayerCount", 4}, {"AverageLevel", 8}, {"IsHardcoreRule", True} }
取值处理时,用TypeOf判断元素实际类型再做对应转换即可,不会出现类型错误,适配你「文本描述+掷骰数值」的处理逻辑:
For Each item In dndCampaignData If TypeOf item.Value Is Integer Then ' 数值类型走掷骰计算、数值校验逻辑 Dim numValue = CInt(item.Value) ElseIf TypeOf item.Value Is String Then ' 字符串类型走文本拼接、描述展示逻辑 Dim strValue = CStr(item.Value) End If Next
方案2:自定义实体类(最适配DND项目长期维护的方案)
如果你的混合存储场景是固定存「文本描述符+掷骰数值属性」的结构化数据,更建议自定义专属实体类,后续遍历处理、拼接SQL写入数据库的时候逻辑更清晰,也不会出现误存错误类型数据的问题:
' 定义DND战役属性实体 Public Class DndAttribute Public Property DescText As String ' 存储描述文本 Public Property RollValue As Integer? ' 存储掷骰生成的数值,支持空值 End Class ' 使用示例 Dim attrList As New List(Of DndAttribute) From { New DndAttribute With {.DescText = "力量属性", .RollValue = 18}, New DndAttribute With {.DescText = "角色阵营", .RollValue = Nothing} }
后续写INSERT INTO语句入库时,直接遍历实体类取对应属性即可,不需要反复做类型判断,代码维护成本更低。
方案3:使用值元组存储固定结构的混合数据
如果你的数据结构固定为「文本标识+可选数值」的配对形式,不需要存入其他杂类型,用值元组的实现更轻量,不需要额外定义类:
' 声明值元组列表,第一个字段存文本描述,第二个字段存可空数值 Dim attrTupleList As New List(Of (desc As String, val As Integer?)) From { ("敏捷属性", 16), ("角色背景", Nothing) } ' 取值输出结果为16 Console.WriteLine(attrTupleList(0).val)
注意:不建议使用.Net早期版本的非泛型
ArrayList、Hashtable实现混合存储,这类遗留实现性能远低于泛型集合,也没有开发时的类型提示,容易写出隐藏bug。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

