Общий словарь - получение ошибки преобразования - PullRequest
7 голосов
/ 17 июня 2010

Следующий код дает мне ошибку:

        // 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 ]

16 голосов
/ 17 июня 2010

Должно быть:

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

Словарь не содержит других словарей, он содержит пары ключей и значений.

6 голосов
/ 17 июня 2010

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:\\"));
4 голосов
/ 17 июня 2010

Я думаю, что многие из вышеупомянутых людей ответили на вопрос, почему вы получаете ошибку, т. Е. Словарь хранит KeyValuePairs и не сохраняет Dictionarys. Чтобы предотвратить небольшие ошибки, подобные той, что у вас есть, я бы предложил использовать новый синтаксис в вашей разработке.

foreach (var eachItem in myDirectoryList)

Тип var будет выведен из myDirectoryList, и вы не столкнетесь с той же проблемой. Также, если вы решите изменить тип myDirectoryList и свойства его дочерних элементов будут такими же, ваш код все равно будет компилироваться.

4 голосов
/ 17 июня 2010

вы должны использовать:

Dictionary<string, DirectoryInfo> myDirectoryList = GetDirectoryList();
foreach (KeyValuePair<string, DirectoryInfo> itemPair in myDirectoryList) {
    //do something
}
4 голосов
/ 17 июня 2010

Элементы хранятся не в словаре, а в 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)
1 голос
/ 17 июня 2010

Посредством foreach вы выполняете итерацию каждого элемента словаря, затем вы должны определить тип данных, который содержит диктонар, то есть

KeyValuePair<string, DirectoryInfo>

, а не тип диктонары.Итак, правильный путь:

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

Словарь является универсальным типом, поэтому нет необходимости упаковывать и распаковывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...