我正在使用图片框显示图像,并以一秒的间隔计时。我试图避免连续两次显示相同的图像,并使用arraylist来避免相同的随机图像跟随另一个。
这就是我所做的。不能像我预期的那样工作,并最终得到一个例外。 如何改进这一点以避免连续两次显示相同的图像?
Random random = new Random();
ArrayList imagesList = new ArrayList();
Image[] images = { imageOne, imageTwo, imageThree, imageFour, imageFive, imageSix, imageSeven };
do
{
try
{
for (int i = 0; i < images.Length; i++)
{
imagesList.Add(images[random.Next(0, 7)]);
while (imagesList.Contains(images[i]))
{
imagesList.Clear();
imagesList.Add(images[random.Next(0, 7)]);
}
picImage.Image = (Image)imagesList[0];
}
Thread.Sleep(1000);
}
catch (IndexOutOfRangeException ind)
{
MessageBox.Show(ind.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception exe)
{
MessageBox.Show(exe.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
} while (true);
}
答案 0 :(得分:5)
你可以做一个随机播放而不是随机数字。然后,如果已经使用了图像,则无需每次都进行检查。看这里看看你如何改组数组:http://www.dotnetperls.com/shuffle。现在你可以循环遍历数组,它现在已经随机化,你不会得到重复数据。
我猜你使用睡眠来避免每次都获得相同的随机值?你现在可以删除它。除此之外,它将阻止用户界面。
答案 1 :(得分:2)
重新排序图片:
Image[] randomOrder = images.OrderBy(i => Guid.NewGuid()).ToArray();
并遍历该数组。
您还需要使用计时器来更改图像,因为您当前正在阻止UI线程。 System.Windows.Forms.Timer
是合适的。您的计时器的Tick
事件处理程序将如下所示:
private int index = 0;
private void Timer_Tick(Object sender, EventArgs args)
{
picImage.Image = randomOrder[index % randomOrder.Length];
index++;
}
此Timer
课程的MSDN示例代码也很有帮助。请注意,框架中有几个Timer
类,这个类可能是最好的。