gpt4 book ai didi

c# - 以正确的方式从递归方法返回并填充集合

转载 作者:太空宇宙 更新时间:2023-11-03 21:19:23 25 4
gpt4 key购买 nike

我将要编写一个方法(或 2 个方法),它应该返回文件夹层次结构(包括所有子文件夹)中所有文件的列表。当我只填写一个全局列表时,我知道如何处理它。这对我有用(这不是我的问题)。但是我想在方法中填充列表,因此我遇到了递归问题。到目前为止我在这里:

public List<string> GetAllFiles(string path)
{
List<string> files = new List<string>();

FindFiles(files, path);

return files;
}

private void FindFiles(List<string> files, string path)
{
if (Directory.Exists(path))
{
try
{
foreach (string folder in Directory.GetDirectories(path))
{
FindFiles(files, folder);
}

foreach (string file in Directory.GetFiles(path).ToArray())
{
files.Add(file);
}
}
catch (Exception)
{
// ignored
}
}
}

这行得通,但我将列表作为引用传递,我认为这不是一种干净的方式。如何“正常”处理?提前致谢。

最佳答案

您的方法非常简洁,因为它让您创建列表一次,填写它,然后返回给调用者,而不会创建重复项。

鉴于方法签名返回 List<string> , 另一种选择会稍微浪费一些,因为它会在层次结构的每个级别创建一次性列表:

public List<string> GetAllFiles(string path) {
var res = new List<string>();
if (Directory.Exists(path)) {
try {
foreach (var folder in Directory.GetDirectories(path)) {
res.AddRange(GetAllFiles(folder));
}
foreach (var file in Directory.GetFiles(path)) {
res.Add(file);
}
} catch (Exception) {
// ignored
}
}
return res;
}

LINQ 使这更加简洁,但方法保持不变:

public List<string> GetAllFiles(string path) {
if (!Directory.Exists(path)) {
return new List<string>();
}
try {
return Directory.GetDirectories(path).SelectMany(folder => GetAllFiles(folder))
.Concat(Directory.GetFiles(path)).ToList();
} catch (Exception) {
return new List<string>();
}
}

关于c# - 以正确的方式从递归方法返回并填充集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31836356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com