Чистый подход к поиску родителя папки - PullRequest
0 голосов
/ 20 декабря 2010

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

Спасибо.

    private void SetProjectFolder(string sessionid)
        {

//IoC container gives the root directory to begin search.
            string[] supportDirs = Directory.GetDirectories(ApplicationContainer.SupportDirectory);
            bool sessionFound = false;

            foreach (string directory in supportDirs)
            {
                if (!sessionFound)
                {
                    foreach (string folder in Directory.GetDirectories(directory))
                    {
                        if (!sessionFound)
                        {
                            foreach (string productSubFolder in Directory.GetDirectories(folder))
                            {
                                if (productSubFolder.Contains(sessionid))
                                {
                                    _productName = Directory.GetParent(productSubFolder).Parent.Name;
                                    sessionFound = true;
                                    break;
                                }
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                else
                {
                    break;
                }
            }
        }

Ответы [ 2 ]

0 голосов
/ 20 декабря 2010

Попробуйте это:

private void SetProjectFolder(string sessionid)
    {
        //This will simulate the contains statement
        string searchPattern = string.Format("*{0}*", sessionid);
        string[] supportDirs = Directory.GetDirectories(ApplicationContainer.SupportDirectory, searchPattern);

        foreach (string filteredFolder in supportDirs)
        {
            _productName = Directory.GetParent(filteredFolder).Name;
            break;
        }
    }
0 голосов
/ 20 декабря 2010

Удаляя sessionFound, вы получаете довольно ясный и понятный код:

private void SetProjectFolder(string sessionid)
{
    //IoC container gives the root directory to begin search.
    string[] supportDirs = Directory.GetDirectories(ApplicationContainer.SupportDirectory);

    // search for product subfolder
    foreach (string directory in supportDirs)
    {
        foreach (string folder in Directory.GetDirectories(directory))
        {
            foreach (string productSubFolder in Directory.GetDirectories(folder))
            {
                if (productSubFolder.Contains(sessionid))
                {
                    // product sub-folder found, set it and exit
                    _productName = Directory.GetParent(productSubFolder).Parent.Name;
                    return;
                }
            }
        }
    }

    // product sub-folder not found
    !!! handle error path
}

Если ваша структура каталогов статична в смысле вышеупомянутого алгоритма поиска, я не думаю,что-то не так с вложенными foreach утверждениями.Может быть, вы могли бы извлечь код, начинающийся с середины foreach, в отдельный метод, например string FindProductSubfolderInFolder(Directory).

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