Persönlich würde ich eine binäre Suche verwenden, um die nächste Versammlung zu finden. ..
- Anfang n = 1
- tut TestAssembly1.dll zu existieren? (Ja)
- ist TestAssembly2.dll vorhanden? (Ja)
- ist TestAssembly4.dll vorhanden? (Ja)
- ist TestAssembly8.dll vorhanden? (Ja)
- ist TestAssembly16.dll vorhanden? (Ja)
- ist TestAssembly32.dll vorhanden? (No)
und keine Verwendung binäre Suche zwischen 16 und 32:
- tut TestAssembly24.dll zu existieren? (Ja)
- ist TestAssembly28.dll vorhanden? (Ja)
- ist TestAssembly30.dll vorhanden? (no)
- ist TestAssembly29.dll vorhanden? (Ja)
so verwenden TestAssembly30.dll
Dies vermeidet die Notwendigkeit, die Zählung getrennt zu halten, so wird es auch funktionieren, wenn Sie alle Dateien löschen - und die binäre Suche bedeutet, dass Sie dies nicht tun habe eine schlechte Leistung.
Nicht getestet, aber etwas wie unten; auch beachten, dass etwas auf Datei Existenz basierte sofort eine Race-Bedingung (obwohl in der Regel ein sehr schlankes eins):
static string GetNextFilename(string pattern) {
string tmp = string.Format(pattern, 1);
if (tmp == pattern) {
throw new ArgumentException(
"The pattern must include an index place-holder", "pattern");
}
if (!File.Exists(tmp)) return tmp; // short-circuit if no matches
int min = 1, max = 2; // min is inclusive, max is exclusive/untested
while (File.Exists(string.Format(pattern, max))) {
min = max;
max *= 2;
}
while (max != min + 1) {
int pivot = (max + min)/2;
if (File.Exists(string.Format(pattern, pivot))) {
min = pivot;
}
else {
max = pivot;
}
}
return string.Format(pattern, max);
}
Es hängt von der Problemdomäne ab. Brauchen Sie eine spezielle Handhabung für Lücken? Erwarten Sie unter normalen Umständen nur eine Handvoll Dateien im Verzeichnis.(eine vollständige Liste von Dateien in einem Verzeichnis zu bekommen ist viel viel billiger als die gleiche Menge von file.exist Operationen) –
@ sambo99 - "eine vollständige Liste zu bekommen .... ist viel billiger"; das hängt von der Anzahl der Dateien im Verzeichnis ab ... –
@ sambo99; Beachten Sie, dass es nur 6 file.Exists Tests für die ersten 32 Dateien gibt. Bei diesem Ansatz müssen Sie keine Liste der Dateien abrufen. –