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

问题描述

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

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

案例1:

  • 如果IS_PROC为true,那么我将以不同的方式获取files,然后将其返回给用户
  • 在这种情况下,我有一个IEnumerable查询,由于我的方法签名是IList,因此我将其转换回列表。不确定将IEnumerable转换为List是否是个好主意。

案例2:

  • 如果IS_PROC为假,则以另一种方式获取files,然后将其返回给用户
  • 在这种情况下,我只有一个列表,所以我只返回它。

下面是我的代码

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;
}

所以我的问题是-

  • 考虑到我在两种情况下的处理方式,从我的方法返回IList有意义吗?
  • 我的一个案例也返回IEnumerable,而另一个案例返回List,以便使其与我的方法签名兼容,我将IEnumerable转换为Case1中的列表?这是将IEnumerable转换为List的正确方法吗?
  • 有什么更好的方法可以编写上述方法

解决方法

您可以以任何一种方式编写该方法,这实际上取决于您要执行的操作。如果您想返回IEnumerable,则可以不进行ToList()调用,它应该可以工作。您还可以将GetFiles替换为Directory.EnumerateFiles,因为它还会返回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>();
    }
}

否则,您可以在返回值的末尾添加.ToList()并返回IList。请注意,List实现了IEnumerable,因此无论哪种情况都可以返回List