我需要将文件名与用户输入进行比较,并且必须显示匹配的文件。我正在使用递归函数。我将匹配的文件存储在列表中。但是当我返回列表时遇到问题。如何从递归调用的函数返回值?
答案 0 :(得分:2)
您可以使用参数“返回”数据。例如:
public void MyRecursiveFunction(List<string> files, int depth)
{
files.Add("...");
if (depth < 10)
{
MyRecursiveFunction(files, depth + 1);
}
}
答案 1 :(得分:0)
选项1(更好的方法):
您可以将字符串传递给递归方法,使用逗号将文件名追加到递归函数内的字符串,并在从内部调用递归函数时传递相同的字符串。更好的选择是使用StringBuilder而不是字符串。
选项2(不推荐):
您可能希望声明一个全局变量,函数会向其附加数据。
在这两个选项中,您可以使用List&lt;&gt;如果更合适。
答案 2 :(得分:0)
这是微不足道的;你设置一个退出案例:
function f (List m){
if( y )
{
m.Add(k);
return f(m);
}
return m;
}
答案 3 :(得分:0)
将列表作为参数传递。所有类都是“指针”,所以当它在func中被修改时,变化随处可见。如果我没有回答你的问题,那就是我几天前写的东西。
哎呀,这并没有显示传递列表。但是你基本上做了下面但是用一个列表而不是一个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;
}
}
}
答案 4 :(得分:0)
由于您使用的是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过滤掉目录。 Where根据投影中的每个文件名搜索预期文件名集。