问题描述
我有一个下面的代码,该代码返回所有文件的列表。它正在从文件夹和子文件夹中读取所有文件,并将其作为列表返回给用户。
下面的代码中有两种情况。
案例1:
- 如果
IS_PROC
为true,那么我将以不同的方式获取files
,然后将其返回给用户。 - 在这种情况下,我有一个
IEnumerable
查询,由于我的方法签名是IList
,因此我将其转换回列表。不确定将IEnumerable
转换为List
是否是个好主意。
案例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;
}
所以我的问题是-
- 考虑到我在两种情况下的处理方式,从我的方法返回
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
。