请注意,我的操作假定您打算使用directory
参数来代替rootDir
类级变量。
这里有两个选项。
的哈克,但更高效的方式
在这种情况下,您通过列表对象。我将使用List<string>
而不是ArrayList
。
public List<string> getMusicFiles(string directory) {
var list = new List<string>();
getMusicFiles(list, directory);
return list;
}
private void getMusicFilesInternal(List<string> songpaths, string directory)
{
string[] localFiles= System.IO.Directory.GetFiles(directory);
for(int i=0; i<localFiles.Length-1; i++) {
if(isMusicFile(localFiles[i])) {
songpaths.add(localFiles[i]);
}
}
string[] localFolders= System.IO.Directory.GetDirectories(directory);
for(int i=0; i<localFolder.Length-1; i++) {
getMusicFiles(songpaths, localFolder[i]);
}
}
的效率较低,但功能性的方式
返回列表,每次聚集的结果,你递归:
public IList<string> getMusicFiles(string directory)
{
List<string> songpaths = new List<string>();
string[] localFiles= System.IO.Directory.GetFiles(directory);
for(int i=0; i<localFiles.Length-1; i++) {
if(isMusicFile(localFiles[i])) {
songpaths.add(localFiles[i]);
}
}
string[] localFolders= System.IO.Directory.GetDirectories(directory);
for(int i=0; i<localFolder.Length-1; i++) {
songpaths.AddRange(getMusicFiles(localFolder[i]));
}
return songpaths;
}
您还可以实现这一点使用延迟执行,这仍然是不如第一个例子那么高效,但是为您提供更多的灵活性,使您能够使用结果:
public IEnumerable<string> getMusicFiles(string directory)
{
string[] localFiles= System.IO.Directory.GetFiles(directory);
for(int i=0; i<localFiles.Length-1; i++) {
if(isMusicFile(localFiles[i])) {
yield return localFiles[i];
}
}
string[] localFolders= System.IO.Directory.GetDirectories(directory);
for(int i=0; i<localFolder.Length-1; i++) {
foreach (var j in getMusicFiles(localFolder[i])) {
yield return j;
}
}
}
这将返回一个枚举值,它将执行搜索操作,每次您枚举它,类似于Linq查询的工作方式。您可以在结果上调用ToList()
以执行查询并将结果存储在列表中,您可以多次枚举而不必再次执行查询。
如果我清理了所有的代码,以下是我可能会选择使用的变体。您的原始代码有几个问题(您从阵列的Length
属性中减去一个,即使这会导致您跳过最后一个元素,并且还有其他一些拼写错误)。
public IEnumerable<string> getMusicFiles(string directory)
{
foreach (var file in System.IO.Directory.GetFiles(directory)) {
if (isMusicFile(file)) {
yield return file;
}
}
foreach (var dir in System.IO.Directory.GetDirectories(directory)) {
foreach (var musicFile in getMusicFiles(dir)) {
yield return musicFile;
}
}
}
如果您担心foreach
的性能,请不要。首先,您应该首先对可读性和性能进行编码,只有在发现瓶颈时才进行优化。其次,当你在一个数组类型上使用foreach
时,编译器会将它变成等效的基于Length
的迭代,而不是通过IEnumerator<T>
来访问该数组。
为什么有人会在这里使用'ArrayList'而不是'List'? –
ja72
2013-05-07 22:38:25
你对'directory'参数做了什么? – cdhowie 2013-05-07 22:40:52