2009-04-13 11 views
3

Haben Sie Vorschläge, wie Sie diese Methode verbessern können? Ich benutze es derzeit, um ein einzelnes Hintergrundbild aus einem Verzeichnis von Hintergrundbildern zu wählenWählen Sie eine zufällige Datei aus dem Verzeichnis

Ich weiß, dass Sie Arraylist nicht mehr verwenden sollten, aber ich könnte nicht an eine Alternative denken auch bin ich nicht sicher, wie für mehr als nur eine Art von Filtern Datei (zB jpg gif png) im Verzeichnis info.

irgendwelche Vorschläge oder Verbesserungen würden

private string getrandomfile(string path) 
     { 
      ArrayList al = new ArrayList(); 
      DirectoryInfo di = new DirectoryInfo(path); 
      FileInfo[] rgFiles = di.GetFiles("*.*"); 
      foreach (FileInfo fi in rgFiles) 
      { 
       al.Add(fi.FullName); 
      } 

      Random r = new Random(); 
      int x = r.Next(0,al.Count); 

      return al[x].ToString(); 

     } 

Dank

Absturz

Antwort

2

Changed eine einzelne Instanz des Pseudozufallszahlengenerators zu verwenden.

var files = Directory.GetFiles(path, "*.*").Where(s => Regex.Match(s, @"\.(jpg|gif|png)$").Success); 
string randFile = path + files.ToList()[r.Next(0, files.Count())]; 
+1

ich bin nicht dagegen, aber warum sind alle so verliebt in Var. Ich dachte, dass das nicht gut war Best Practices – Crash893

+1

Ich denke, es ist lesbarer. Da C# stark typisiert ist, verlieren Sie damit nicht die Typsicherheit, und typischerweise ist es aus dem RHS der Zuweisung offensichtlich, was der Typ ist, damit Sie die Semantik nicht verlieren. – tvanfosson

+0

scheint es auch, dass rgFiles.length ungültig ist. meinst du zählen? Normalerweise würde ich nicht fragen, aber ich bin nicht sehr vertraut mit der linq. Wenn ich .count <> muss ich zwischen den <> angeben, was die Zählung ist? – Crash893

2

Haben Sie wirklich die Arraylist überhaupt benötigen, Sie sollten in der Lage sein, es zu beseitigen und verwenden nur das Array direkt fantastisch Sobald Sie eine Zufallszahl generiert haben.

Außerdem sollen Sie prüfen, ob der Pfad gültig ist ... wenn sie von einem Benutzer angegeben ...

+0

ich damit einverstanden sind, und ich denke, die LINQ trieben. – andrewrk

10

Warum LINQ nicht verwenden. Ich habe von tvanfosson (korrekte) Antwort gebaut, nicht weil das "mehr" korrekt ist; aber weil ich denke, dass es ein nützlicher Ansatz ist.

private static string getRandomFile(string path) 
{ 
    try 
    { 
     var extensions = new string[] { ".png", ".jpg", ".gif" }; 

     var di = new DirectoryInfo(path); 
     return (di.GetFiles("*.*") 
          .Where(f => extensions.Contains(f.Extension 
                   .ToLower())) 
          .OrderBy(f => Guid.NewGuid()) 
          .First()).FullName ;    
    } 
    catch { return ""; } 
} 
5

Wie immer - es gibt mehr als einen Weg, die Haut eine Katze:

// Use a class variable so that the RNG is only created once. 
private Random generator; 
private Random Generator 
{ 
    get 
    { 
     if (this.generator == null) 
     { 
      this.generator = new Random(); 
     } 
     return this.generator; 
    } 
} 
private string getrandomfile(string path) 
{ 
    string file = null; 
    if (!string.IsNullOrEmpty(path)) 
    { 
     var extensions = new string[] { ".png", ".jpg", ".gif" }; 
     try 
     { 
      var di = new DirectoryInfo(path); 
      var rgFiles = di.GetFiles("*.*") 
          .Where(f => extensions.Contains(f.Extension 
                   .ToLower()); 
      int fileCount = rgFiles.Count(); 
      if (fileCount > 0) 
      { 
       int x = this.Generator.Next(0, fileCount); 
       file = rgFiles.ElementAt(x).FullName; 
      } 
     } 
     // probably should only catch specific exceptions 
     // throwable by the above methods. 
     catch {} 
    } 
    return file; 
} 
1

Ich machte ein paar Änderungen

hier ist der Code, den ich am Ende mit, ich einige der conditonals ausgeschnitten becuase sie wirklich Angelegenheit nicht (wenn es keine Dateien sind es null ohnehin keine Notwendigkeit, zurück zweimal testen). Ich korrigierte auch für ein paar kleinere Syntaxfehler und ein Benutzer wies darauf hin, dass die Rückkehr nach unten verschoben werden sollte.

auch in Bezug auf die zufällige Klasse, Ich bin nicht sicher, warum es schlecht war, es zu nennen, aber ich sehe nicht, dass es notwendig ist, da dies nur einmal alle 10 bis 15 min. und selbst dann würde es nur die Klasse erstellen, wenn Dateien gefunden wurden.

Vielen Dank für die Hilfe aller (tvanfosson)

private string getrandomfile2(string path) 
    { 
     string file = null; 
     if (!string.IsNullOrEmpty(path)) 
     { 
      var extensions = new string[] { ".png", ".jpg", ".gif" }; 
      try 
      { 
       var di = new DirectoryInfo(path); 
       var rgFiles = di.GetFiles("*.*").Where(f => extensions.Contains(f.Extension.ToLower())); 
       Random R = new Random(); 
       file = rgFiles.ElementAt(R.Next(0,rgFiles.Count())).FullName; 
      } 
      // probably should only catch specific exceptions 
      // throwable by the above methods. 
      catch {} 
     } 
     return file; 
    } 
+0

Danke. Das hat mir geholfen, die Bilder, die für eine Login-Trainings-App geladen werden, die ich für meinen 5-Jährigen geschrieben habe, randomisieren zu lassen. – meffordm

Verwandte Themen