2017-04-04 34 views
0

聲明詞典(整數,AnonymousType)我要聲明與一個整數作爲密鑰和匿名對象作爲值的vb.net字典。這是由每個循環的並行填充。匿名類的屬性總是相同的。但是有沒有辦法用匿名對象的簽名來聲明字典?在vb.net

現在,我使用的整數和對象的字典。

Dim MyDict As New Dictionary(Of String, Dictionary(Of Integer, Object))(12) 
'In my loop 
Dim MyLinqDict = Something.GroupBy(…).ToDictionary(Function(x) x.Kex, Function(x) New With {.a = 1, .b = 2}) 
MyDict.Add(MyKey, MyLinqDict) 

現在,顯而易見的問題是,該內部字典的內容只是一個對象。我既不知道,如果,如果是,如何我可以聲明內字典與實際的對象。我也不知道,如果我能強制轉換是「對象」的匿名類型。

Dim MyContent = DirectCast(MyDict("Some key")(1), ???).a 

有人可以在這方面幫助我嗎?

+0

你不能兩面都有。它是匿名的或不是。如果您需要能夠投並有一定的財產訪問了''然後你需要定義,而不是使用對象了。如果你想要匿名你要只相信你是不會得到這並不具有任何對象'了' –

+0

匿名類型是一個LINQ的便利。當你必須這樣做時,他們不再方便。所以不要這樣做,請聲明一個輔助類來存儲結果。現在很簡單。 –

回答

4

如果像你說的,屬性總是會一樣,只需要創建一個新的類和填充它:

Dim MyDict As New Dictionary(Of String, Dictionary(Of Integer, MyObject))(12) 

Dim MyLinqDict = Something.GroupBy(…).ToDictionary(Function(x) x.Kex, Function(x) New MyObject With {.a = 1, .b = 2}) 

Public Class MyObject 
    Public Property a() As Integer 
    Public Property b() As Integer 
End Class 

問題解決了!

+0

謝謝!這是解決方案。 –

+0

不客氣! – Ric

1

不是。類型是未知的,因爲它是..很好的匿名。

如果所有值都具有相同數量的項目,元組可以用來代替:

Dim d1 = New Dictionary(Of Integer, Dictionary(Of Integer, Tuple(Of Integer, Integer))) 

Dim d2 = {1, 2}.ToDictionary(Function(i) i, Function(i) Tuple.Create(1, 2)) 

d1.Add(0, d2) 

Dim MyContent = d1(0)(1).Item1 
0

創建一個簡單的POCO類。這真的是最好的解決方案。

假設說,如果您創建了一些通用的幫助器方法,則可以使用具有泛型類型推斷的匿名類。

static Dictionary<TKey, TValue> Create<TKey, TValue>(TKey sampleKey, TValue sampleValue) 
{ 
    return new Dictionary<TKey, TValue>(); 
} 

static TValue GetValueForKey<TKey, TValue>(IDictionary<TKey, TValue> dic, TKey key) 
{ 
    return dic[key]; 
} 

// Usage 
var anonymousObject = new { a = "a_ok", b = "b_ok" }; 
var dic = Create(0, anonymousObject); // Only creates the dictionary 
dic.Add(1, anonymousObject);   // Adds a key/value pair 

var value = GetValueForKey(dic, 1).a; // Yields "a_ok"