0

特定の検索パターン (*.txt など) を使用して、ディレクトリから再帰的にファイルを列挙できるようにしたいと考えています。ただし、いくつかの制約があります。

  1. メカニズムは非常に効率的でなければなりません。目標は、(IEnumerable を使用して) ファイルを 1 つずつ列挙することです。そのため、ファイルのリストが膨大な場合でも、1 つのファイルを処理するのに永遠にかかることはありません。
  2. 列挙はファイルをランダムに返す必要があるため、プログラムの 2 つのインスタンスがディレクトリを列挙しようとしても、両方が同じ順序でファイルを表示することはありません。

要件を考えると、DirectoryInfo.EnumerateFilesは有望に見えますが、2 番目の要件を満たしていません。パフォーマンスに関する考慮事項を取り除けば、ソリューションは簡単です (コレクション全体を取得し、アクセスする前にシーケンスをランダム化するだけです)。

誰かが .net 3.5/4.0 での C# 実装の可能な選択肢を提案できますか?

4

1 に答える 1

1

あなたが求めていることは不可能です。

真に「ランダムな」列挙 (順序が毎回変わる可能性が高いという意味で) には、「置換せずに選択する」戦略が必要です。このような戦略には、必然的に 2 つのプールが必要です。1 つは「選択された」ファイルで、もう 1 つは「選択されていない」ファイルです。「選択されていない」リストは、ランダムに「選択」できるようになる前に、入力する必要があります。これはあなたの一番の要件を破ります。

あなたの問題を解決する方法に関する2つの考え:

  1. 2 つのインスタンスが同じ順序でファイルを参照する場合の問題は何ですか? ファイルのロックの問題である場合は、読み取り専用ロックを選択してください。

  2. 「ホールドパイル」アプローチで逃げることができるかもしれません。ここでは、少数の FileInfo レコードを "Hold" コレクションに読み込むことから始まる、独自の列挙子クラスを作成します。次に、呼び出し元のコードがファイルを要求するたびに、EnumerateFiles から直接ファイルをフィードするか、そこからファイルを読み取りますが、「ホールド」パイル内のファイルと交換して、代わりにそのファイルを返します。EnumerateFiles が何も返さなくなるまで決定はランダムになり、その時点でホールド パイルを空にすることになります。それは本当にランダムな選択順序を提供しませんが、ニーズを満たすのに十分なあいまいさを順序に追加するかもしれません. 「ホールド」コレクションの最大サイズは好みに合わせて調整し、「ランダム性」の必要性のバランスを取ることができます

于 2011-06-22T05:50:24.320 に答える