以下代码给出了一个错误:
// 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循环吗?
答案 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)
字典是一种通用类型,因此不需要装箱和拆箱。