为什么我得到一个Unable来为以下代码转换类型' WhereSelectEnumerableIterator的对象?

时间:2014-03-28 19:44:25

标签: c# linq dictionary

我得到一个'无法投射类型' 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));
}

1 个答案:

答案 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都指向那一个字典。如果您希望这些键实际指向不同的词典,则需要创建一堆不同的词典。