随机化图片框中的图像而不重复
Randomizing images in picture boxes without repeating
我是编程领域的新手,我希望能够使用一个按钮在多个图片框中显示随机照片。问题是我不希望一张照片显示在多个框中。所以每个 pictureBox 应该包含不同的图像。过去几个小时我搜索了 Google,但没有得到任何有用的信息。我现在所拥有的是,按下按钮时,每个 pictureBox 都变成空白。虽然这是我在 button1_Click 中的代码:
{
List<string> name = new List<string>();
name.Add("0.jpg");
name.Add("1.jpg");
name.Add("2.jpg");
name.Add("3.png");
List<PictureBox> box = new List<PictureBox>();
box.Add(pictureBox1);
box.Add(pictureBox2);
box.Add(pictureBox3);
box.Add(pictureBox4);
a = 4;
ResourceManager rm = MatchGame.Properties.Resources.ResourceManager;
for (int i = 0; i < box.Count; i++)
{
int randomPic = new Random().Next(0, name.Count);
string randomName = name[randomPic];
name.Remove(randomName);
Image img = rm.GetObject(randomName) as Image;
box[i].Image = img;`
}
}
您可以做的是将图片参考存储在字典中。
将图片名称与 PictureBox 索引相关联 - 然后您需要做的就是检查字典值并查看图片名称是否在字典中。如果它在字典中 - 那么就让 while 循环再做一次循环 - 以选择另一个图像。要回收,您需要做的就是清除字典,这个过程可以重新开始。
Dictionary<int, string> MyActivePictures = new Dictionary<int, string>();
如果是多线程,请使用 concurrentDictionary。
// Where MyActivePictures < PictureBoxControl , picturename > is the Dictionary
Dictionary<int, string> MyActivePictures = new Dictionary<int, string>();
// i is your PictureBoxes index as you loop through them
int i = 0;
if(box.Count < name.Length){
do
{
int randomPic = new Random().Next(0, name.Count);
string randomName = name[randomPic];
if(!MyActivePictures.Values.Contains[randomName])
{
name.Remove(randomName);
Image img = rm.GetObject(randomName) as Image;
box[i].Image = img;
MyActivePictures[i]=randomName;
i++;
}
if (i > name.Length) // exits the loop in case there are more
{
i = box.Count + 1;
}
}while (i < box.Count);
}
我应该补充一点,如果上面的代码不可能得到一张独特的图片——例如图片框 > 图片数量。那么这段代码就会陷入死循环。您需要在 while 循环中考虑该场景 - if(图片框值的迭代器 I > 总图像 - 退出循环。因此 if(i > totalimages)退出循环。
我添加了额外的代码来处理这个:但是
您也可以简单地将该测试包含在 while 条件中 - 它更容易 ((i names.Length))
一种简单的方法是简单地随机排列您的名单
List<string> name = new List<string>();
name.Add("0.jpg");
name.Add("1.jpg");
name.Add("2.jpg");
name.Add("3.png");
List<PictureBox> box = new List<PictureBox>();
box.Add(pictureBox1);
box.Add(pictureBox2);
box.Add(pictureBox3);
box.Add(pictureBox4);
// 2 lines code for shuffle every kind of IEnumerable
Random r = new Random();
name = name.OrderBy(x => r.Next()).ToList();
ResourceManager rm = MatchGame.Properties.Resources.ResourceManager;
for (int i = 0; i < box.Count; i++)
{
// no need to remove elements from name list
string randomName = name[i];
Image img = rm.GetObject(randomName) as Image;
box[i].Image = img;`
}
这将确保每张图片只被挑选一次(当然,只要图片框的数量与资源中存储的图片相同)。
确保每个 rm.GetObject returns 不同的图像。
作为旁注,永远不要在循环中创建 new Random()
:实例化单个 Random
并继续对其调用 .Next
(请参阅 this question)。上面的代码这样写会出错:
name = name.OrderBy(x => new Random.Next()).ToList();
我是编程领域的新手,我希望能够使用一个按钮在多个图片框中显示随机照片。问题是我不希望一张照片显示在多个框中。所以每个 pictureBox 应该包含不同的图像。过去几个小时我搜索了 Google,但没有得到任何有用的信息。我现在所拥有的是,按下按钮时,每个 pictureBox 都变成空白。虽然这是我在 button1_Click 中的代码:
{
List<string> name = new List<string>();
name.Add("0.jpg");
name.Add("1.jpg");
name.Add("2.jpg");
name.Add("3.png");
List<PictureBox> box = new List<PictureBox>();
box.Add(pictureBox1);
box.Add(pictureBox2);
box.Add(pictureBox3);
box.Add(pictureBox4);
a = 4;
ResourceManager rm = MatchGame.Properties.Resources.ResourceManager;
for (int i = 0; i < box.Count; i++)
{
int randomPic = new Random().Next(0, name.Count);
string randomName = name[randomPic];
name.Remove(randomName);
Image img = rm.GetObject(randomName) as Image;
box[i].Image = img;`
}
}
您可以做的是将图片参考存储在字典中。 将图片名称与 PictureBox 索引相关联 - 然后您需要做的就是检查字典值并查看图片名称是否在字典中。如果它在字典中 - 那么就让 while 循环再做一次循环 - 以选择另一个图像。要回收,您需要做的就是清除字典,这个过程可以重新开始。
Dictionary<int, string> MyActivePictures = new Dictionary<int, string>();
如果是多线程,请使用 concurrentDictionary。
// Where MyActivePictures < PictureBoxControl , picturename > is the Dictionary
Dictionary<int, string> MyActivePictures = new Dictionary<int, string>();
// i is your PictureBoxes index as you loop through them
int i = 0;
if(box.Count < name.Length){
do
{
int randomPic = new Random().Next(0, name.Count);
string randomName = name[randomPic];
if(!MyActivePictures.Values.Contains[randomName])
{
name.Remove(randomName);
Image img = rm.GetObject(randomName) as Image;
box[i].Image = img;
MyActivePictures[i]=randomName;
i++;
}
if (i > name.Length) // exits the loop in case there are more
{
i = box.Count + 1;
}
}while (i < box.Count);
} 我应该补充一点,如果上面的代码不可能得到一张独特的图片——例如图片框 > 图片数量。那么这段代码就会陷入死循环。您需要在 while 循环中考虑该场景 - if(图片框值的迭代器 I > 总图像 - 退出循环。因此 if(i > totalimages)退出循环。 我添加了额外的代码来处理这个:但是 您也可以简单地将该测试包含在 while 条件中 - 它更容易 ((i names.Length))
一种简单的方法是简单地随机排列您的名单
List<string> name = new List<string>();
name.Add("0.jpg");
name.Add("1.jpg");
name.Add("2.jpg");
name.Add("3.png");
List<PictureBox> box = new List<PictureBox>();
box.Add(pictureBox1);
box.Add(pictureBox2);
box.Add(pictureBox3);
box.Add(pictureBox4);
// 2 lines code for shuffle every kind of IEnumerable
Random r = new Random();
name = name.OrderBy(x => r.Next()).ToList();
ResourceManager rm = MatchGame.Properties.Resources.ResourceManager;
for (int i = 0; i < box.Count; i++)
{
// no need to remove elements from name list
string randomName = name[i];
Image img = rm.GetObject(randomName) as Image;
box[i].Image = img;`
}
这将确保每张图片只被挑选一次(当然,只要图片框的数量与资源中存储的图片相同)。
确保每个 rm.GetObject returns 不同的图像。
作为旁注,永远不要在循环中创建 new Random()
:实例化单个 Random
并继续对其调用 .Next
(请参阅 this question)。上面的代码这样写会出错:
name = name.OrderBy(x => new Random.Next()).ToList();