2017-04-04 31 views
0

整数をキーに、匿名オブジェクトを値として持つvb.net辞書を宣言したいと思います。これは、各ループに対して並列で満たされます。匿名クラスのプロパティは常に同じです。しかし、匿名オブジェクトの署名で辞書を宣言する方法はありますか?vb.netで辞書(Of Integer、AnonymousType)を宣言する

今、私は整数とオブジェクトの辞書を使用しています。

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) 

明らかな問題は、その内部辞書の内容が単なるオブジェクトであることです。私は知っているかどうか、もしあれば、実際の目的でその内面を宣言することはできません。匿名の型として "Object"を型キャストできるかどうかは分かりません。

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

誰か助けてもらえますか?

+0

両方の方法を使用することはできません。それは匿名かどうかです。プロパティー 'a'にキャストしてアクセスできるようにする必要がある場合は、objectを使用する代わりに定義する必要があります。匿名にしたい場合は、 'a 'を持たないオブジェクトを取得しないことを信用しなければなりません。 –

+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" 
関連する問題