为什么我为以下代码获得类型为"WhereSelectEnumerableIterator"的"无法强制转换对象"?



当我试图将一个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都指向那个字典。如果你想让这些键指向不同的字典,你需要创建一堆不同的字典。

相关内容

  • 没有找到相关文章

最新更新