2009-04-13 125 views
3

,关于如何提高这种方法有什么建议?我目前使用它来从目录中选择一张壁纸从目录中选择随机文件

我知道你不应该使用arraylist了,但我无法想到altrnative 也我不知道如何过滤不只是一种类型文件(即jpg gif png)在目录info中。

任何建议或调整将是非常美妙

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

改为使用伪随机数生成器的一个实例。

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

我不反对它,但为什么每个人都如此爱上瓦尔。我认为这不是最佳做法 – Crash893 2009-04-14 02:26:01

+1

我认为它更具可读性。因为C#是强类型的,所以你不会失去它的类型安全性,并且通常从作业的RHS中明显知道类型是什么,所以你不会失去语义。 – tvanfosson 2009-04-14 02:32:54

+0

也似乎rgFiles.length是无效的。你的意思是算数吗? Normaly我不会问,但我不是很熟悉的LINQ。如果我做.count <>是否需要在<>的数量之间进行分类? – Crash893 2009-04-14 12:52:31

2

你真的需要ArrayList中的一切,你应该能够消除它而直接使用数组一旦你产生了一个随机数。

此外,你应该检查路径是否有效......如果由用户指定的...

+0

我同意这一点,我认为LINQ是矫枉过正。 – andrewrk 2009-07-28 06:28:37

10

为什么不使用LINQ:

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

像往常一样 - 存在于皮肤猫不止一种方法。我已经建立了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 ""; } 
} 
1

我做了一些改动

这里是我最后使用的代码,我剪下一些conditonals的监守他们并不真正的问题(如果没有文件,它会返回null反正也没必要测试两次)。我还纠正了一些小的语法错误,一位用户指出退回应该下移。

也是关于Random类,林不知道为什么它是坏的,以保持调用它,但我没有看到它的必要的,因为这将只运行一次,每次10〜15分钟。即使如此,如果找到文件,它也只会创建该类。

感谢大家的帮助(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 2011-10-07 03:36:12