Цикл foreach внутри цикла foreach в методе и возвращаемые значения

#c# #methods #foreach #return-value

#c# #Методы #foreach #Возвращаемое значение

Вопрос:

У меня есть следующий код, в котором я пытаюсь перечислять файлы на общем диске, собирать свойства для каждого файла, а затем возвращать каждую запись из этой коллекции.

Visual Studio выдает мне «CS0161: ‘Program.EnumerateYourFiles (string)’: не все пути кода возвращают значение». ошибка при наведении курсора мыши на метод EnumerateYourFiles. Я предполагаю, что это связано с тем фактом, что переменная «l», которую я пытаюсь вернуть, находится вне области видимости. Как мне получить эту переменную «l» в область видимости, чтобы она возвращалась для функции?

 using System;
using System.IO;
using System.Collections.Generic;


namespace FileShareMachine
{
    public class Program
    {
           

        static void Main(string[] args)
        {
            Console.WriteLine(EnumerateYourFiles(@"E:"));


        }
        public static object EnumerateYourFiles(string pathToSearch)
        {
            string filePath = pathToSearch;
            DirectoryInfo currentParentFileList = new DirectoryInfo(filePath);
            DirectoryInfo[] listOfSubDirectories = currentParentFileList.GetDirectories();
            List<string> listOfAllFiles = new System.Collections.Generic.List<string>();
            
          
            foreach (var parentPath in listOfSubDirectories)
            {
                string pathForEnumeration = parentPath.ToString();
                DirectoryInfo individualSubFolder = new DirectoryInfo(pathForEnumeration);
               
                try
                {
                    foreach (var eachFile in individualSubFolder.EnumerateFiles("*", SearchOption.AllDirectories))
                    {
                        string individualPaths = eachFile.FullName.ToString();
                        string lastAccessed = eachFile.LastAccessTime.ToString();
                        string fileSize = eachFile.Length.ToString();
                        string creationTime = eachFile.CreationTime.ToString();
                        string lastWriteTime = eachFile.LastWriteTime.ToString();
                        string fileDirectory = eachFile.Directory.ToString();

                        //The following works like a dream. This is how you write to a file. You need an array or list
                        listOfAllFiles.Add(individualPaths);
                        listOfAllFiles.Add(fileSize);
                        listOfAllFiles.Add(fileDirectory);
                        listOfAllFiles.Add(creationTime);
                        listOfAllFiles.Add(lastAccessed);
                        listOfAllFiles.Add(lastWriteTime);

                 
                    }
                }
                catch (System.UnauthorizedAccessException)
                {
                    bool errorThrown = true;
                    if (errorThrown)
                    {
                        Console.WriteLine("The following path had an access error {0}", individualSubFolder);
                        continue;
                    }
                    else
                    {
                        continue;
                    }

                }
            }

            //return listOfSubDirectories;
            foreach(object l in listOfAllFiles)
            {
                return l;
            }
         

        }

    }
}
  

Ответ №1:

 foreach(object l in listOfAllFiles)
{
    return l;
}
  

не сработает.

Попробуйте

 return listOfAllFiles
  

вместо этого.

Рассмотрите возможность возврата чего-то другого, кроме an object , like IEnumerable<string> , если только этого не требует ваш вариант использования object (это не беспрецедентно; в WPF есть подобные места).

Если вы пытаетесь возвращать один элемент из списка при каждом вызове метода, попробуйте

 yield return l;
  

вместо этого. Затем ваш метод должен вернуть a string .