是否可以使用自定义结构代替KeyValuePair?
而不是
For Each kvp As KeyValuePair(Of class1,class2) In myDict
Dim c1 As kvp.Key
Dim c2 As kvp.Value
Next
我想用
For Each kvp As myKvp In myDict
Dim c1 As kvp.P1
Dim c2 As kvp.P2
Next
我想仅使用myKvp代替KeyValuePair(Of class1,class2)(不适用于其他类型)。
我尝试将myKvp创建为
Public Structure myKvp
Public P1 As class1
Public P2 As class2
Public Sub New(_p1 As class1,_p2 As class2)
P1 = _p1
P2 = _p2
End Sub
End Structure
但我收到了消息
System.Collections.Generic.KeyValuePair(Of ASP...class1, ASP...class2)
类型的值无法转换为'ASP ... myKvp'。
答案 0 :(得分:3)
您需要显式创建myKvp
的实例。您可以使用Linq轻松完成:
For Each kvp As myKvp In myDict.Select(Function(x) New myKvp(x.Key, x.Value))
Dim c1 = kvp.P1
Dim c2 = kvp.P2
Next
答案 1 :(得分:2)
使用List或任何其他泛型集合代替字典。字典需要KeyValuePair作为其集合项。
更新
您可以创建自己的类,该类将实际的Dictionary<T,S>
对象子类化,并公开名称比Key
和Value
更有意义的公共属性,但它们只是指向基础{{1}的指针}} Dictionary
和Key
。您仍将保留基础词典的所有功能。
希望它有所帮助。
答案 2 :(得分:0)
这个简短而迂腐的答案是,不。
虽然这两个结构具有相同的布局,但编译器将解释定义myKvp的行为(而不是使用通用KeyValuePair),因为您主动声明您希望它将它们视为两个不同的东西。毕竟,如果KeyValuePair(Of TKey,TValue)是您想要的,那么为什么不使用KeyValuePair(Of TKey,TValue)?
但是,您可以implementing CType()为您的自定义类型偷偷摸摸。但这样做与告诉编译器将myKvp视为KeyValuePair(Class1,Class2)的别名完全不同 - 相反,它告诉编译器,在需要时,您可以从实例中获取所有数据一个类,并通过使用您提供的CType()函数将其变为另一个类的新实例。