如何使用自定义结构代替KeyValuePair?

时间:2011-05-23 23:09:26

标签: .net vb.net

是否可以使用自定义结构代替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'。

3 个答案:

答案 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>对象子类化,并公开名称比KeyValue更有意义的公共属性,但它们只是指向基础{{1}的指针}} DictionaryKey。您仍将保留基础词典的所有功能。

希望它有所帮助。

答案 2 :(得分:0)

这个简短而迂腐的答案是,不。

虽然这两个结构具有相同的布局,但编译器将解释定义myKvp的行为(而不是使用通用KeyValuePair),因为您主动声明您希望它将它们视为两个不同的东西。毕竟,如果KeyValuePair(Of TKey,TValue)是您想要的,那么为什么不使用KeyValuePair(Of TKey,TValue)?

但是,您可以implementing CType()为您的自定义类型偷偷摸摸。但这样做与告诉编译器将myKvp视为KeyValuePair(Class1,Class2)的别名完全不同 - 相反,它告诉编译器,在需要时,您可以从实例中获取所有数据一个类,并通过使用您提供的CType()函数将其变为另一个类的新实例。