将 IEnumerable 转换为 List 以符合方法签名
Convert IEnumerable to List to comply with method signature
我有一个下面的代码,它是所有文件的 returning 列表。它正在读取文件夹和子文件夹中的所有文件,然后 return 将其作为列表返回给用户。
我在下面的代码中有两种情况。
案例一:
- 如果
IS_PROC
为真,那么我会以不同的方式获得 files
,然后 return 返回给用户。
- 在这种情况下,我有一个
IEnumerable
查询,我正在将其转换回列表,因为我的方法签名是 IList
。不确定将 IEnumerable
转换为 List
. 是否是个好主意
案例2:
- 如果
IS_PROC
为假,那么我会以另一种方式获得 files
,然后 return 返回给用户。
- 在这种情况下,我只有一个列表,所以我只是 return 那个。
下面是我的代码:
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
IList
是否有意义?
- 也是我的案例 returns
IEnumerable
和其他案例 return List
之一,因此为了使其与我的方法签名兼容,我将 IEnumerable
在 Case1 中列出?这是将 IEnumerable
转换为列表的正确方法吗?
- 上面的方法有什么更好的写法吗?
你可以用任何一种方式编写方法,这真的取决于你想做什么。如果你想 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
。
我有一个下面的代码,它是所有文件的 returning 列表。它正在读取文件夹和子文件夹中的所有文件,然后 return 将其作为列表返回给用户。
我在下面的代码中有两种情况。
案例一:
- 如果
IS_PROC
为真,那么我会以不同的方式获得files
,然后 return 返回给用户。 - 在这种情况下,我有一个
IEnumerable
查询,我正在将其转换回列表,因为我的方法签名是IList
。不确定将IEnumerable
转换为List
. 是否是个好主意
案例2:
- 如果
IS_PROC
为假,那么我会以另一种方式获得files
,然后 return 返回给用户。 - 在这种情况下,我只有一个列表,所以我只是 return 那个。
下面是我的代码:
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
IList
是否有意义? - 也是我的案例 returns
IEnumerable
和其他案例 returnList
之一,因此为了使其与我的方法签名兼容,我将IEnumerable
在 Case1 中列出?这是将IEnumerable
转换为列表的正确方法吗? - 上面的方法有什么更好的写法吗?
你可以用任何一种方式编写方法,这真的取决于你想做什么。如果你想 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
。