2011-05-23 19 views
3

是否可以使用自定義結構來代替KeyValuePair?如何使用自定義結構代替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(Class 1的,等級2)只(不用於其他類型)。

我試圖創建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

您需要明確創建一個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 
+0

很高興知道這可以實現,但這並不能簡化事情。僅僅爲kvp的屬性獲取更多有意義的名字會帶來太多的開銷。我想我會堅持使用.Key和.Value – ic3b3rg 2011-05-24 14:59:35

+0

@ ic3b3rg,你總是可以使用匿名類型而不是創建自己的KVP結構:'myDict.Select(Function(x)New With {.P1 = x.Key ,.P2 = x.Value})' – 2011-05-24 15:43:44

+0

我一定會將它記錄下來供將來使用。在這種情況下,我認爲我最好只使用默認屬性。謝謝! – ic3b3rg 2011-05-24 17:28:11

0

這個簡短而迂迴的答案是,沒有。

雖然這兩個結構具有相同的佈局,但編譯器會解釋定義myKvp的行爲(而不是使用通用KeyValuePair),因爲您主動聲明您希望它將它們視爲兩個截然不同的事物。畢竟,如果KeyValuePair(TKey,TValue)是你想要的,那麼爲什麼不使用KeyValuePair(TKey,TValue)呢?

但是,您可以通過implementing CType()潛入您的自定義類型。但是這樣做與告訴編譯器將myKvp作爲KeyValuePair(Class1,Class2的別名)的對待並不是一回事 - 相反,它告訴編譯器,在需要時,可以將所有數據從實例中取出通過使用您提供的CType()函數來將它綁定到另一個類的新實例中。

2

而不是字典使用列表或任何其他通用集合。字典需要KeyValuePair作爲它們的收集項目。

更新:

你可以創建自己的類的子類實際Dictionary<T,S>對象和揭露公共屬性的名字比KeyValue更有意義,但僅會指向底層DictionaryKeyValue。您仍然可以保留底層字典的所有功能。

希望它有幫助。

+0

我同意,使用'Dim myDict As New List(Of myKvP)' – SSS 2011-05-24 05:43:48

+0

這是一個很好的建議,我考慮切換到列表。不幸的是,我還需要通過密鑰進行搜索,並且我不想爲此進行O(n)操作。看起來我只是堅持使用Dictionary和KeyValuePair。 – ic3b3rg 2011-05-24 15:02:30