2009-04-13 13 views
3

この方法を改善するための提案はありますか?私は現在、altrnative を考える私はあなたがもうArrayListのを使うことになっていない知っているが、私はcouldntの壁紙ディレクトリから任意のファイルを選択

のディレクトリから単一の壁紙を選択するためにそれを使用していものちょうど1種類以上をフィルタリングする方法がわからないイムディレクトリ情報にファイル(つまり、jpg gif png)を追加します。

任意の提案や微調整が

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(); 

     } 

おかげ

クラッシュ

答えて

2

は、擬似乱数生成器の単一のインスタンスを使用するように変更した場合、パスは...有効であることを確認する必要があります。いつものように

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

私はそれに反対していませんが、なぜ誰もがVarを愛しています。私はそれが良くないと思ったベストプラクティス – Crash893

+1

私はそれがより読みやすいと思います。 C#は強く型付けされているので、型の安全性を損なうことはありません。通常、型のRHSからは、セマンティクスを失うことはありません。 – tvanfosson

+0

また、rgFiles.lengthが無効であるようです。カウントを意味しましたか? ノーマル私はlinqに慣れていません。私が.count <>を実行すると、<>の間にspesifyする必要がありますか? – Crash893

2

素晴らしいだろうあなたが本当にすべてでArrayListのが必要です、あなたはそれを排除することができるだけで直接配列を使用する必要がありますいったん乱数を生成すると

また、あなたは、ユーザーが指定した...

+0

私はこれに同意し、私は、LINQはやり過ぎだと思います。 – andrewrk

10

なぜLINQを使用していません。私はtvanfosson(正しい)答えを構築しました。なぜなら、これはもっと「正しい」ためです。私はそれが有用なアプローチだと思うからです。

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

- 猫の皮を剥ぐために複数の方法があります:

// 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

私は(ファイルがない場合、それはとにかくnullを返します必要はありませんここで

は、私が使用して終了コードでいくつかの変更を加えて、彼らは本当に重要いけないbecuase、私はconditonalsの一部を切り取ります2回テストする)。また、いくつかの軽微な構文エラーを修正し、1人のユーザーがリターンを下げるべきだと指摘しました。

ランダムなクラスに関しても、なぜそれを呼び出すのが悪かったのか分からないが、これは10〜15分ごとに1回しか実行されないため、必要ではないことが分かります。それでもファイルが見つかった場合にのみクラスを作成します。みんなの助けを

おかげで(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

ありがとうございます。これは私が私の5歳のために書いたログイントレーニングアプリのために読み込んだ画像をランダム化するのに役立ちました。 – meffordm

関連する問題