当我试图将一个Dictionary类型转换为另一个Select时,我得到一个'无法转换类型'WhereSelectEnumerableIterator的对象"。我看不出有什么明显的原因。请帮助。
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));
}
您有一个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);
与此无关的是,您只创建了一个内部字典,并将其设置为您创建的每个键的值。你可能以为你已经把这本字典抄了十遍了。你没有。这里只有一个 Dictionary<string, string>
;你有10个不同的guid都指向那个字典。如果你想让这些键指向不同的字典,你需要创建一堆不同的字典。