請注意,我的操作假定您打算使用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