2009-11-26 8 views
0

J'ai besoin de comparer les noms de fichiers avec l'entrée utilisateur et d'afficher les fichiers correspondants. J'utilise une fonction récursive pour cela.J'ai stocké les fichiers correspondants dans une liste.Mais j'ai des problèmes quand je retourne la liste. Comment retourner des valeurs d'une fonction appelée récursivement?Problème récursif

+0

Vous pourriez vouloir écrire du code. –

+0

Sans code ni explication supplémentaire, il n'y a pas grand chose à faire sur le problème. – ckknight

Répondre

0

Option 1 (meilleure approche):

Vous pouvez passer une chaîne à la méthode récursive, ajoutez le nom de fichier par une virgule à la chaîne dans la fonction récursive et passer la même chaîne lorsque la fonction récursive est appelée à partir en lui-même. Une meilleure option serait d'utiliser un StringBuilder plutôt qu'une chaîne.

Option 2 (non recommandé):

Vous pouvez déclarer une variable globale ont la fonction append des données.

Dans les deux options, vous pouvez utiliser une liste <> si cela est plus approprié.

0

C'est trivial; vous définissez un cas de sortie:

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

    return m; 
} 
2

Vous pouvez «renvoyer» des données à l'aide de paramètres. Par exemple:

public void MyRecursiveFunction(List<string> files, int depth) 
{ 
    files.Add("..."); 
    if (depth < 10) 
    { 
     MyRecursiveFunction(files, depth + 1); 
    } 
} 
0

Passez la liste en tant que paramètre. Toutes les classes sont des 'pointeurs' donc quand elles sont modifiées dans la fonction, les changements apparaissent partout. Si je n'ai pas répondu à votre question, voici quelque chose que j'ai écrit il y a quelques jours. Oups, cela ne montre pas passer une liste autour. Cependant vous faites essentiellement ci-dessous mais avec une liste au lieu d'un int? passer la liste en tant que param. Aussi, vous pouvez rechercher le mot clé ref, mais ce n'est pas nécessaire.

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

Puisque vous utilisez C# 3.0, vous pouvez utiliser LINQ pour simplifier votre problème:

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

Je ne l'ai pas testé le code ci-dessus, il pourrait avoir besoin de peaufinage ... Les GetFileSystemInfos vous récupère les objets DirectoryInfo et FileInfo, puis projette la même opération sur chaque entrée retournée avec SelectMany. SelectMany va aplatir la structure hiérarchique. OfType filtre les répertoires. The Où recherche l'ensemble des noms de fichiers attendus par rapport à chaque nom de fichier de votre projection.