0

我希望能够从目录中递归地枚举具有特定搜索模式(例如 *.txt)的文件。但有几个限制:

  1. 该机制应该非常有效。目标是逐个枚举文件(使用 IEnumerable),这样如果有一个巨大的文件列表,那么获取一个文件进行处理就不会花费很长时间。
  2. 枚举应该随机返回文件,这样如果我的程序的两个实例都在尝试枚举目录,那么两者都不应该以相同的顺序看到文件。

鉴于这些要求,DirectoryInfo.EnumerateFiles看起来很有希望,只是它不满足第二个要求。如果我删除性能考虑,解决方案很简单(只需获取整个集合并在访问之前随机化序列)。

有人可以建议在 .net 3.5/4.0 中实现 C# 的可能选择吗?

4

1 回答 1

1

你所要求的是不可能的。

真正的“随机”枚举(从某种意义上说,每次顺序都可能发生变化)需要“选择不替换”策略。这样的策略必然需要两个池:一个是“选择的”文件,一个是“未选择的”文件。必须先填充“未选择”列表,然后才能随机“选择”其中的任何内容。这打破了您的 #1 要求。

关于如何解决您的问题的两个想法:

  1. 两个实例以相同的顺序查看文件有什么问题?如果是文件锁定问题,请选择只读锁定。

  2. 您也许可以通过“持桩”方法逃脱。在这里,您将创建自己的枚举器类,首先将少量 FileInfo 记录读入“Hold”集合。然后,每次您的调用代码请求一个文件时,它要么直接从 EnumerateFiles 提供一个文件,要么从那里读取一个文件,但将其与“Hold”堆中的一个交换出来,然后返回那个文件。该决定将是随机的,直到 EnumerateFiles 没有返回任何内容,此时您将清空您的 Hold 堆。这不会提供真正的随机选择顺序,但可能会为顺序增加足够的模糊性以满足您的需求。“Hold”集合的最大尺寸可以根据口味调整,以平衡您对“随机性”的需求

于 2011-06-22T05:50:24.320 回答