2010-06-17 20 views
7

Các mã sau đây được đem lại cho tôi một lỗi:Generic điển - Bắt Lỗi chuyển đổi

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

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

Các lỗi nó mang lại như sau:

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

Câu hỏi của tôi là: tại sao là nó cố gắng thực hiện chuyển đổi này? Tôi không thể sử dụng vòng lặp foreach trên loại đối tượng này?

Trả lời

16

Nó nên là:

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

Từ điển không chứa các từ điển khác, nó chứa cặp khóa và giá trị.

4

Các mặt hàng được lưu trữ không phải là một cuốn từ điển, nhưng một 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

bạn phải sử dụng:

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

Dictionary<string, DirectoryInfo>

Dụng cụ

IEnumerable<KeyValuePair<string, DirectoryInfo>>

Có nghĩa là vòng lặp foreach được Looping trên KeyValuePair<string, DirectoryInfo> đối tượng:

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

Nó cũng lý do tại sao một trong các phương pháp khuyến nông IEnumerable sẽ luôn luôn làm việc với một đối tượng KeyValuePair cũng như:

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

By foreach bạn lặp lại từng mục của từ điển, sau đó bạn nên xác định kiểu dữ liệu mà giữ nguyên dictonary là

KeyValuePair<string, DirectoryInfo> 

thay vì loại dictonary. Vì vậy, cách chính xác:

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

Từ điển là một loại chung chung, do đó không cần đấm bốc và unboxing.

4

Tôi nghĩ rằng nhiều người ở trên đã trả lời câu hỏi là tại sao bạn nhận được lỗi tức là Từ điển lưu trữ KeyValuePairs và không lưu trữ từ điển. Để ngăn chặn các lỗi nhỏ như lỗi bạn đang gặp phải, tôi sẽ đề xuất sử dụng cú pháp mới trong quá trình phát triển của bạn.

foreach (var eachItem in myDirectoryList) 

Loại var sẽ được suy ra từ myDirectoryList và bạn sẽ không gặp phải vấn đề tương tự. Ngoài ra nếu bạn quyết định thay đổi kiểu myDirectoryList và các thuộc tính trong các phần tử con của nó thì cùng một mã của bạn sẽ vẫn biên dịch.

Các vấn đề liên quan