从目录中选择随机文件[重复]

Posted

技术标签:

【中文标题】从目录中选择随机文件[重复]【英文标题】: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();

        

谢谢

崩溃

【问题讨论】:

【参考方案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 岁孩子编写的登录培训应用加载的图片。

以上是关于从目录中选择随机文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

用js随机从1~100选择一个数字之后选择15个100以内的正整数,不能重复.

从目录中选择随机文件的最佳方法

从目录中随机选择文件的最佳方法

使用联合从 MS Access 表中选择随机记录 [重复]

使用jQuery从数组中选择一个随机元素[重复]

从复选框中选择随机答案的最佳方法[重复]