2010-06-17 42 views
7

下面的代码是给我的错误:通用词典 - 获取转换错误

 // 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循环吗?

回答

16

它应该是:

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

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

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) 
4

必须使用:

Dictionary<string, DirectoryInfo> myDirectoryList = GetDirectoryList(); 
foreach (KeyValuePair<string, DirectoryInfo> itemPair in myDirectoryList) { 
    //do something 
} 
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:\\")); 
1

通过的foreach你迭代每个字典项目,那么你应该定义数据类型,其中dictonary保留是

KeyValuePair<string, DirectoryInfo> 

而不是dictonary的类型。 所以正确的方法:

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

字典是一个通用的类型,因此无需装箱和拆箱的。

4

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

foreach (var eachItem in myDirectoryList) 

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