2010-06-17 75 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的類型,並且其子元素中的屬性相同,則代碼仍會編譯。