通用词典 - 获得转换错误

时间:2010-06-17 13:17:36

标签: c# generics dictionary

以下代码给出了一个错误:

        // GetDirectoryList() returns Dictionary<string, DirectoryInfo>
        Dictionary<string, DirectoryInfo> myDirectoryList = GetDirectoryList();

        // The following line gives a compile error
        foreach (Dictionary<string, DirectoryInfo> eachItem in myDirectoryList)

它给出的错误如下:

Cannot convert type 'System.Collections.Generic.KeyValuePair<string,System.IO.DirectoryInfo>' to 'System.Collections.Generic.Dictionary<string,System.IO.DirectoryInfo>’

我的问题是:为什么要尝试执行此转换?我不能在这种类型的对象上使用foreach循环吗?

6 个答案:

答案 0 :(得分:16)

应该是:

foreach (KeyValuePair<string, DirectoryInfo> eachItem in myDirectoryList)

字典不包含其他字典,它包含键和值对。

答案 1 :(得分:6)

Dictionary<string, DirectoryInfo>

实施

IEnumerable<KeyValuePair<string, DirectoryInfo>>

这意味着foreach循环遍历KeyValuePair<string, DirectoryInfo>个对象:

foreach(KeyValuePair<string, DirectoryInfo> kvp in myDirectoryList)
{
}

这也是为什么任何IEnumerable扩展方法也将始终与KeyValuePair对象一起使用的原因:

// Get all key/value pairs where the key starts with C:\
myDirectoryList.Where(kvp => kvp.Key.StartsWith("C:\\"));

答案 2 :(得分:4)

存储的项目不是字典,而是KeyValuePair:

    // GetDirectoryList() returns Dictionary<string, DirectoryInfo>
    Dictionary<string, DirectoryInfo> myDirectoryList = GetDirectoryList();

    // The following line gives a compile error
    foreach (KeyValuePair<string, DirectoryInfo> eachItem in myDirectoryList)

答案 3 :(得分:4)

你必须使用:

Dictionary<string, DirectoryInfo> myDirectoryList = GetDirectoryList();
foreach (KeyValuePair<string, DirectoryInfo> itemPair in myDirectoryList) {
    //do something
}

答案 4 :(得分:4)

我认为上面的很多人都回答了为什么你得到错误的问题,即The Dictionary存储KeyValuePairs并且不存储Dictionarys。为了阻止像您所拥有的那样的小错误,我建议您在开发中使用新语法。

foreach (var eachItem in myDirectoryList)

var的类型将从myDirectoryList推断出来,你不会遇到同样的问题。此外,如果您决定更改myDirectoryList的类型,并且其子元素中的属性相同,您的代码仍会编译。

答案 5 :(得分:1)

通过foreach迭代每个字典项,然后你应该定义dictonary持有的数据类型

KeyValuePair<string, DirectoryInfo>
而不是dictonary的类型。 所以正确的方式:

foreach (KeyValuePair<string, DirectoryInfo> eachItem in myDirectoryList)   

字典是一种通用类型,因此不需要装箱和拆箱。