我试图在VB.net中实现一个字典,其中的值可以是字符串或十进制



我从下面的代码开始

Public Class DictionaryFromExcel(Of itemType)
Implements IDictionary(Of String, itemType)
Private _Dictionary As Dictionary(Of String, itemType)
Public Sub New(ByVal FileName As String, ByVal Sheet As String, ByVal StartColumnName As String)
    MyBase.New()
    _Dictionary = New Dictionary(Of String, itemType)(System.StringComparer.OrdinalIgnoreCase)

Visual Studio 2012为剩下的代码创建了一个模板,为所有必需的例程留下了存根。除了itemType可以是string或Decimal之外,我对dictionary的正常实现非常满意。如何使用底层实现?

我试图通过调用底层实现来实现添加例程,但我得到一个错误,即类型字符串的值不能转换为itemType。即使我实现了所有必需的例程,我仍然不知道如何从itemType转换为字符串/十进制。

_Dictionary.Add(key, value.ToString)

最好的办法是在字典上实现object属性,比如

Dim dictionary As New Dictionary(Of String,  object)

由于您的类型不是为保存泛型数据类型而设计的,而是为保存两种特定类型而设计的,因此您的类型没有理由应该是泛型的。将其改为简单的Class DictionaryFromExcel

一种方法是使用Dictionary(Of String, Object),并让您的类型实现IDictionary(Of String, Object)。另一种方法是使用Dictionary(Of String, String)保存字符串,使用Dictionary(Of String, Decimal)保存数字;然后,您的集合可以提供IDictionary(Of String, Object)的只读实现(它可以读取存储在任意字典中的内容),具有返回实现IDictionary(Of String, String)的包装器对象的属性Strings,以及返回实现IDictionary(Of String, Decimal)的包装器对象的属性Decimals

前一种方法可以不受限制地在字典中存储任何类型的数据;这可能是件好事,也可能不是。调用者还必须在任何时候使用从对象读取的数据进行类型转换。后一种方法将导致您的类型被硬编码为只处理DecimalString,但是访问myThing.Decimals("George")的您的类型的用户可以使用返回值作为Decimal,而不需要类型转换。后一种方法的最大缺点是,如果代码先执行myThing.Decimals("Fred")=4.4d,然后执行myThing.Strings("Fred")="Flintstone",您必须决定应该发生什么。让后者调用无效myThing.Decimals("Fred")会令人惊讶,但如果没有,则不清楚myThing("Fred")应该返回什么。

最新更新