尽量避免两次显示相同的图像

时间:2013-01-04 07:37:00

标签: c# winforms picturebox

我正在使用图片框显示图像,并以一秒的间隔计时。我试图避免连续两次显示相同的图像,并使用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);
    }

2 个答案:

答案 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类,这个类可能是最好的。