2013-02-04 31 views
4

我想一個簡單的方法使用D.計數文件

據計數目錄中的文件的數量,因爲我可以從d手動告訴,dirEntries返回一個範圍,但這沒有長度屬性。因此,我必須用計數器遍歷結果,或者用傳統數組收集名稱,我可以找到......的長度是否有更好的方法?

auto txtFiles = dirEntries(".", "*.txt", SpanMode.shallow); 

int i=0; 
foreach (txtFile; txtFiles) 
    i++; 

writeln(i, " files found.."); 

回答

13

範圍通常不具有length財產,除非它可以在O(1)計算。任何不能計算其長度優於O(n)的範圍不會具有length屬性,因爲它效率太低。獲得無length屬性的範圍長度的慣用方式是使用std.range.walkLength。如果範圍定義爲length,則它使用length;否則,它只是遍歷範圍並計算有多少元素。

您還可以使用std.algorithm.count,但它用於計算匹配謂詞的元素的數量,雖然它默認爲這對每一個元素返回true一個謂語,這比walkLength效率較低,因爲walkLength不調用元素上的任何元素都會迭代到元素上,如果已定義它,它將使用length,而count決不會。

+1

值得一提的是'walkLength'在可用時會使用'.length',所以沒有理由擔心效率的損失。 –

+0

@PeterAlexander好點。固定。 –

4

您可以使用count from std.algorithm

import std.algorithm, std.stdio, std.file; 

void main() { 
    writeln(count(dirEntries(".", "*.txt", SpanMode.shallow)), " files found"); 
}