Рекурсивная проблема - PullRequest
0 голосов
/ 26 ноября 2009

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

Ответы [ 5 ]

2 голосов
/ 26 ноября 2009

Вы можете «вернуть» данные, используя параметры. Например:

public void MyRecursiveFunction(List<string> files, int depth)
{
    files.Add("...");
    if (depth < 10)
    {
        MyRecursiveFunction(files, depth + 1);
    }
}
0 голосов
/ 26 ноября 2009

Поскольку вы используете C # 3.0, вы можете использовать LINQ для упрощения вашей проблемы:

var expectedNames = getExpectedFilenames();
var matchingFiles = directoryInfo
                        .GetFileSystemInfos()
                        .SelectMany(fsi => fsi.GetFileSystemInfos())
                        .OfType<FileInfo>()
                        .Where(fi => expectedNames.Contains(fi.Name));

Я не тестировал приведенный выше код, поэтому может потребоваться некоторая настройка ... GetFileSystemInfos получит объекты DirectoryInfo и FileInfo, а затем проецирует одну и ту же операцию на каждую возвращенную запись с помощью SelectMany. SelectMany сгладит иерархическую структуру. OfType отфильтровывает каталоги. Где выполняется поиск набора ожидаемых имен файлов по каждому имени файла из вашей проекции.

0 голосов
/ 26 ноября 2009

Передать список в качестве параметра. Все классы являются «указателями», поэтому при их изменении внутри функции изменения появляются повсюду. Если я не ответил на ваш вопрос, вот что я написал несколько дней назад.

упс, это не показывает передачу списка вокруг. Однако вы по существу делаете ниже, но со списком вместо int? передать список в качестве параметра. Также вы можете найти ключевое слово ref, но это не обязательно.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace DeleteWhenBelow
{
    class Program
    {
        static void Main(string[] args)
        {
            var dir = @"C:\Users\FixLoc\Documents\";
            var count = findAndDelete(dir, false, 1);
            Console.WriteLine(count);
        }
        static long findAndDelete(string folder, bool recurse, long filesize)
        {
            long count = 0;
            if(recurse)
            {
                foreach (var d in Directory.GetDirectories(folder))
                {
                    count += findAndDelete(d, recurse, filesize);
                }
            }
            foreach (var f in Directory.GetFiles(folder))
            {
                var fi = new FileInfo(f);
                if (fi.Length < filesize)
                {
                    File.Delete(f);
                    count++;
                }
            }
            return count;
        }
    }
}
0 голосов
/ 26 ноября 2009

Это тривиально; Вы устанавливаете выходной случай:

function f (List m){
   if( y )
   {
       m.Add(k);
       return f(m);
   }

   return m;
}
0 голосов
/ 26 ноября 2009

Вариант 1 (лучший подход):

Вы можете передать строку в рекурсивный метод, добавить имя файла с запятой в строку внутри рекурсивной функции и передать ту же строку, когда рекурсивная функция вызывается изнутри себя. Лучше было бы использовать StringBuilder, а не строку.

Вариант 2 (не рекомендуется):

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

В обоих вариантах вы можете использовать Список <>, если это более уместно.

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