有关如何改进此方法的任何建议?我目前正在使用它从壁纸目录中选择一个壁纸
我知道你不应该再使用arraylist了,但我想不出一个altrnative 我还不确定如何在目录信息中过滤除一种类型的文件(即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();
}
由于
崩溃
答案 0 :(得分: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())];
答案 1 :(得分: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 ""; }
}
答案 2 :(得分:2)
你真的需要ArrayList,你应该能够消除它,并且只要你生成一个随机数就直接使用数组。
此外,您应检查路径是否有效...如果用户指定...
答案 3 :(得分: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;
}
答案 4 :(得分:1)
我做了一些改动
这里是我最终使用的代码,我删除了一些条件因为它们并不重要(如果没有文件它将返回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;
}