在vb.net中声明字典(整型,匿名类型)

在vb.net中声明字典(整型,匿名类型),vb.net,dictionary,anonymous-types,Vb.net,Dictionary,Anonymous Types,我想声明一个vb.net字典,其中一个整数作为键,一个匿名对象作为值。这是由每个循环的平行线填充的。匿名类的属性始终相同。但是有没有办法用匿名对象的签名来声明字典呢 现在,我正在使用整数和对象的字典 Dim MyDict As New Dictionary(Of String, Dictionary(Of Integer, Object))(12) 'In my loop Dim MyLinqDict = Something.GroupBy(…).ToDictionary(Function(x)

我想声明一个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

有人能在这方面帮助我吗?

如果正如您所说,属性总是相同的,只需创建一个新类并填充它:

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

问题解决了

如果如您所说,属性总是相同的,只需创建一个新类并填充它:

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

问题解决了

否。类型未知,因为它是。。嗯,匿名

如果所有值的项数相同,则可以使用Tuple:

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

否。类型未知,因为它是。。嗯,匿名

如果所有值的项数相同,则可以使用Tuple:

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

创建一个简单的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"
静态字典创建(TKey-sampleKey,TValue-sampleValue)
{
返回新字典();
}
静态TValue GetValueForKey(IDictionary dic,TKey)
{
返回dic[键];
}
//用法
var anonymousObject=new{a=“a_-ok”,b=“b_-ok”};
var dic=创建(0,匿名对象);//只创建字典
dic.添加(1,匿名对象);//添加键/值对
var value=GetValueForKey(dic,1).a;//产生“好的”

创建一个简单的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"
静态字典创建(TKey-sampleKey,TValue-sampleValue)
{
返回新字典();
}
静态TValue GetValueForKey(IDictionary dic,TKey)
{
返回dic[键];
}
//用法
var anonymousObject=new{a=“a_-ok”,b=“b_-ok”};
var dic=创建(0,匿名对象);//只创建字典
dic.添加(1,匿名对象);//添加键/值对
var value=GetValueForKey(dic,1).a;//产生“好的”

不能两全其美。不管是不是匿名的。如果您需要能够强制转换并对属性
a
具有明确的访问权限,那么您需要定义它,而不是使用对象。如果你想让它匿名,你必须相信你不会得到任何没有
a
的对象。匿名类型是Linq的便利。当你不得不这样做时,他们就不再方便了。所以不要这样做,声明一个小助手类来存储结果。现在它很简单,你不能两全其美。不管是不是匿名的。如果您需要能够强制转换并对属性
a
具有明确的访问权限,那么您需要定义它,而不是使用对象。如果你想让它匿名,你必须相信你不会得到任何没有
a
的对象。匿名类型是Linq的便利。当你不得不这样做时,他们就不再方便了。所以不要这样做,声明一个小助手类来存储结果。现在很简单,谢谢!这就是解决办法,谢谢!这就是解决办法。