6

我想要一种简单的方法来使用 D 计算目录中的文件数。

据我从 D 手册中可以看出, dirEntries 返回一个范围,但这没有长度属性。因此,我必须用计数器遍历结果,或者在传统数组中收集名称,我可以找到长度......有没有更好的方法?

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

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

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

2 回答 2

15

范围通常没有length属性,除非它可以在O(1). 任何不能更好地计算其长度的范围都不会O(n)具有length属性,因为它的效率太低了。获取没有属性的范围长度的惯用方法length是使用std.range.walkLength. length如果范围定义,则使用length;否则,它只是迭代范围并计算有多少元素。

您也可以使用std.algorithm.count,但它旨在计算与谓词匹配的元素的数量,虽然它默认为为每个元素返回的谓词,true但效率低于walkLength,因为walkLength在迭代时不会调用元素上的任何内容它们,length如果它已被定义,它将使用它,而count永远不会。

于 2013-02-04T18:40:04.247 回答
6

您可以使用count来自std.algorithm.

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

void main() {
    writeln(count(dirEntries(".", "*.txt", SpanMode.shallow)), " files found");
}
于 2013-02-04T16:20:45.443 回答