将 IEnumerable 转换为 List 以符合方法签名

Convert IEnumerable to List to comply with method signature

我有一个下面的代码,它是所有文件的 returning 列表。它正在读取文件夹和子文件夹中的所有文件,然后 return 将其作为列表返回给用户。

我在下面的代码中有两种情况。

案例一:

案例2:

下面是我的代码:

private IList<string> ReadFiles(string path)
{
    var files = new List<string>();
    try
    {
        if (IS_PROC)
        {
            // case 1:
            IEnumerable<string> query =
                from directory in System.IO.Directory.EnumerateDirectories(path)
                let dev = System.IO.Path.Combine(directory, "dev")
                from file in System.IO.Directory.EnumerateFiles(directory)
                let fi = new System.IO.FileInfo(file)
                let dev_file = System.IO.Path.Combine(dev, fi.Name)
                select System.IO.File.Exists(dev_file) ? dev_file : file;
            // is this the right way to do it?
            return (!query.Any()) ? files : query.ToList();
        }
        // case 2:
        var lclJsonFiles = Directory.GetFiles(path, "*.json", SearchOption.AllDirectories);
        var lclTxtFiles = Directory.GetFiles(path, "*.txt", SearchOption.AllDirectories);
        files.AddRange(lclJsonFiles);
        files.AddRange(lclJsonFiles);
    }
    catch (Exception ex)
    {
        // log error here
    }
    return files;
}

所以我的问题是 -

你可以用任何一种方式编写方法,这真的取决于你想做什么。如果你想 return 一个 IEnumerable,你可以停止 ToList() 调用,它应该可以工作。您也可以将 GetFiles 替换为 Directory.EnumerateFiles,因为它也是 return 一个 IEnumerable:

private IEnumerable<string> ReadFiles(string path)
{
    try
    {
        return IS_PROC
            ? (from directory in Directory.EnumerateDirectories(path)
                let dev = Path.Combine(directory, "dev")
                from file in Directory.EnumerateFiles(directory)
                let fi = new FileInfo(file)
                let devFile = Path.Combine(dev, fi.Name)
                select File.Exists(devFile) ? devFile : file)
            : Directory
                .EnumerateFiles(path, "*.json", SearchOption.AllDirectories)
                .Union(Directory.EnumerateFiles(path, "*.txt", SearchOption.AllDirectories));
    }
    catch (Exception ex)
    {
        // log error here
        return new List<string>();
    }
}

否则,您可以在 return 值和 return 和 IList 的末尾添加 .ToList()。请注意,List 实现了 IEnumerable,因此在任何一种情况下,您都可以 return 一个 List