我得到一个'无法投射类型' WhereSelectEnumerableIterator'''当我尝试从Select中将一种Dictionary类型转换为另一种时。我没有看到任何明显的原因。请帮忙。
void Main()
{
Dictionary<string,Dictionary<string,string>> test = new Dictionary<string,Dictionary<string,string>>();
Dictionary<string,string> inner = new Dictionary<string,string>();
for(int n = 0; n< 10; n++)
{
var data = n.ToString();
inner[data] = data;
}
for(int n2 = 0; n2 < 10; n2++)
{
test[Guid.NewGuid().ToString()] = inner;
}
// test conversion
var output = (Dictionary<Guid,Dictionary<string,string>>) test.Select(x => new KeyValuePair<Guid, Dictionary<string,string>>(new Guid(x.Key), x.Value));
}
答案 0 :(得分:3)
你有IEnumerable<Guid,Dictionary<string,string>>
。你显然想要一个Dictionary<Guid,Dictionary<string,string>>
。当您尝试将一个分配给另一个时,您会收到编译时错误,告知您IEnumerable
不是Dictionary
,而只是IEnumerable
。你提供了一个演员,这是一种说法,“抱歉编译器,但你错了,我比你知道的更好;这个IEnumerable
实际上是一本字典,在幕后。”可悲的是,这不是这种情况。您实际上没有Dictionary
,而是WhereSelectEnumerableIterator
,而不是Dictionary
。
您可以通过多种方式创建字典,其中一种方法是使用ToDictionary
:
var output = test.ToDictionary(x => new Guid(x.Key), x => x.Value);
在一个不相关的注释中,您只创建了一个内部字典,并将其设置为您创建的每个键的值。你可能会认为你已经复制了这本字典10次。你还没有。这里只有一个 Dictionary<string, string>
;你只有10个不同的GUID都指向那一个字典。如果您希望这些键实际指向不同的词典,则需要创建一堆不同的词典。