【问题标题】:select random file from directory [duplicate]从目录中选择随机文件[重复]
【发布时间】:2009-04-13 02:30:01
【问题描述】:

关于如何改进此方法的任何建议?我目前正在使用它从壁纸目录中选择单个壁纸

我知道你不应该再使用 arraylist 但我想不出替代方案 我也不确定如何在目录信息中过滤不止一种类型的文件(即 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();

        }

谢谢

崩溃

【问题讨论】:

    标签: c# .net file random


    【解决方案1】:

    为什么不使用 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())];
    

    【讨论】:

      【解决方案2】:

      一如既往 - 给猫剥皮的方法不止一种。我已经建立了 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 ""; }
      }
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 我不反对,但为什么每个人都这么爱 Var。我认为这不是好的最佳做法
        • 我认为它更具可读性。由于 C# 是强类型的,因此您不会失去类型安全性,通常从赋值的 RHS 中可以明显看出类型是什么,因此您不会失去语义。
        • 似乎 rgFiles.length 无效。你是说计数吗? Normaly 我不会问,但我对 linq 不是很熟悉。如果我这样做 .count 是否需要在 之间指定计数是什么?
        • 糟糕。我在一个地方更正了它,但没有在另一个地方更正。是的,它应该是 .Count() 而不是长度,因为它不是数组而是 IEnumerable.
        • 您的 return file; 在 if(...) 内,应该会导致编译错误(并非所有路径都返回值)。
        【解决方案4】:

        你真的需要ArrayList吗,你应该可以消除它,只要你生成一个随机数就直接使用数组。

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

        【讨论】:

        • 我同意这一点,我认为 LINQ 是矫枉过正。
        【解决方案5】:

        我做了一些改变

        这是我最终使用的代码,我删除了一些条件,因为它们并不重要(如果没有文件,它无论如何都会返回 null,无需测试两次)。我还纠正了一些小的语法错误,一位用户指出应该将返回值向下移动。

        关于随机类,我不知道为什么继续调用它是不好的,但我认为它没有必要,因为它只会每 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;
            }
        

        【讨论】:

        • 谢谢。这有助于我随机化为我为 5 岁孩子编写的登录培训应用加载的图片。
        猜你喜欢
        • 1970-01-01
        • 2020-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        • 2020-02-19
        相关资源
        最近更新 更多