Как получить FileInfo через цикл foreach?

Пытаюсь конвертировать немного VB в C#... (тоже изучаю C#). У меня есть некоторый код, который просматривает файлы в каталоге и получает информацию о них. У меня это изначально на VB, но я пытаюсь изучать C#, и онлайн-конвертеры не дают мне код, который пройдет.net 2.0.

Вот ошибка:Type and identifier are both required in a foreach statement

Вот код, который у меня есть:

DirectoryInfo dirInfo = new DirectoryInfo(currentDir);
FileInfo[] files = null;
files = dirInfo.GetFiles();

FileInfo f = default(FileInfo);
foreach (f in files) {  ...
}

Я пытался положить foreach(FileInfo f... но это дает мне другую ошибку: A local variable named 'f' cannot be declared in this scope because it would give a different meaning to 'f', which is already used in a 'parent or current' scope to denote something else

Как мне это исправить?

4 ответа

Решение
DirectoryInfo dirInfo = new DirectoryInfo(currentDir);
FileInfo[] files = null;
files = dirInfo.GetFiles();

// I removed the declaration of f here to prevent the name collision.
foreach (FileInfo f in files)
{  ...
}

Вот более простая версия кода:

DirectoryInfo dirInfo = new DirectoryInfo(currentDir);
foreach (FileInfo f in dirInfo.GetFiles())
{
}

Вы должны предоставить тип переменной, используемой внутри цикла. В вашем случае это будет FileInfo, Но с C# 3.0 или позже вы можете просто написать var и компилятор выведет тип для вас:

foreach (FileInfo f in files) 
{  
   // ...
}

Подробнее о выражении foreach читайте здесь.

Полное решение (вам не нужно инициализировать переменную итерации и массив файлов):

DirectoryInfo dir = new DirectoryInfo(currentDir);
foreach (FileInfo file in dir.GetFiles()) 
{
   // use file  
}

Вот где, похоже, вы ошибаетесь:

FileInfo f = default(FileInfo);
foreach (f in files) {  ...
}

Вы определяете f вне цикла, а затем пытаетесь определить его в цикле.

Если вам нужно по умолчанию f, попробуйте это:

FileInfo f = default(FileInfo);
foreach (FileInfo file in files)
    {
         relevant code here
    }

В противном случае удалите оператор, объявляющий переменную "f"

Это должно работать:

        DirectoryInfo dirInfo = new DirectoryInfo(currentDir);
        FileInfo[] files = null;
        files = dirInfo.GetFiles();
        foreach (FileInfo f in files)
        {
        }

Редактировать:

Это было бы чище, на мой взгляд:

        foreach (FileInfo f in new DirectoryInfo(currentDir).GetFiles())
            {
            }
Другие вопросы по тегам