【发布时间】:2020-12-22 02:04:42
【问题描述】:
我有一个下面的代码,它返回所有文件的列表。它正在从文件夹和子文件夹中读取所有文件并将其作为列表返回给用户。
我在下面的代码中有两种情况。
案例1:
- 如果
IS_PROC为真,那么我会以不同的方式获取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 的正确方法吗? - 上面的方法有没有更好的写法?
【问题讨论】:
-
如果您在案例 1 中不执行
.ToList();,则不会枚举查询,因此评估将由调用者完成(以及调用者代码中引发的异常)。但是case1和2是完全不同的,你应该使用两个不同的方法 -
是的,即使我执行两个单独的方法,一个会返回 IEnumerable,另一个会返回 IList,所以在调用方我期待列表,那么我应该更改调用方以期待 IEnumerable 吗?
-
如果你想返回一个
IEnumerable<string>,那么你可以return query;在case 1和return Directory.EnumerateFiles(path, "*.json", SearchOption.AllDirectories).Union(Directory.EnumerateFiles(path, "*.txt", SearchOption.AllDirectories));在case 2。但正如 Camilo 所指出的,IEnumerable的行为与List不同:在访问集合之前不会进行评估(当您调用.ToList()时会发生这种情况),这将发生在调用方。 -
我明白了,如果我想在 case1 中返回
IList,那么我所做的是对的吗?return (!query.Any()) ? files : query.ToList(); -
为什么不总是返回
query.ToList()?files那时也是一个空列表。
标签: c# list ienumerable