Skip to main content
 首页 » 编程设计

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

2024年02月05日26Leo_wl

我将要编写一个方法(或 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>(); 
    } 
}