用循环填充数组
Posted
技术标签:
【中文标题】用循环填充数组【英文标题】:Fill an array with a loop 【发布时间】:2016-03-21 21:59:25 【问题描述】:我想获得比现在更短的代码,但我不知道怎么做。
我现在做的就像下面的代码。
arrPictureBox[0] = picChair0;
arrPictureBox[1] = picChair1;
arrPictureBox[2] = picChair2;
arrPictureBox[3] = picChair3;
arrPictureBox[4] = picChair4;
arrPictureBox[5] = picChair5;
arrPictureBox[6] = picChair6;
arrPictureBox[7] = picChair7;
arrPictureBox[8] = picChair8;
arrPictureBox[9] = picChair9;
arrPictureBox[10] = picChair10;
arrPictureBox[11] = picChair11;
(pic) 是一个图片框。
但我想要更少的代码,但我不知道是否可以使用循环(for 循环)来做到这一点。
for (int i = 0 ; i < arrPictureBox.Length; i++)
arrPictureBox[i] = picChair + i;
【问题讨论】:
你是如何创建 picChair 的? @LOLslowSTi 如果“picChairXX”是表单上的控件,它将与***.com/questions/2168363/… 等许多问题之一重复(更多可以通过bing.com/search?q=c%23+winform+array+controls 等搜索找到)......所以可能不是控制但什么? 通过Type.GetFields反射?如果你只是想要一个简洁的符号,你可以使用arrPictureBox = new[] picChar0,picChair1,picChair2
...
人们只是假设事物并回答问题,这很有趣。这里显然没有足够的信息来产生一个简洁的答案。给出的信息,唯一的答案是SomeType[] arrPictureBox = picChair0, picChair1, picChair2, picChair3, picChair4, picChair5, picChair6, picChair7, picChair8, picChair9, picChair10, picChair11;
我只是想知道是否可以将上面的代码放在一个循环中,我制作的应用程序类型是 Windows 窗体,而 picChairx 是图片框(控件)
【参考方案1】:
你可以使用下面的列表。
List<string> arrPictureBox = new List<string>();
for (int i = 0; i < 20; i++)
arrPictureBox.Add("picChair" + i);
var result = arrPictureBox.ToArray();
希望对你有帮助。
【讨论】:
【参考方案2】:让我们预测您在WinForms
上并且pictureBoxes
已经存在,那么您可以使用以下内容:
for (int i = 0; i < arrPictureBox.Length; i++)
arrPictureBox[i] = this.Controls["picChair" + i];
实际上是这样做的:
使用给定名称获取第一个Control
(例如 PictureBox
)
将找到的控件添加到图片框数组中
编辑:
检查不存在的pictureBoxes
可能很有用:
for (int i = 0 ; i < arrPictureBox.Length; i++)
var pb = this.Controls["picChair" + i] as PictureBox;
if (pb != null)
arrPictureBox[i] = pb;
【讨论】:
谢谢,这就是我提到的。 @Sandeerius 没问题,这就是SO
的用途:D【参考方案3】:
如果所有图片框都在同一个表单上并且是表单上唯一的图片框,您可以使用以下内容循环它们:
int x = 0;
foreach(Control c in this.Controls)
if(c is PictureBox)
arrPictureBox[x++] = c
【讨论】:
arrPictureBox 的大小如何?我没有投票给你。 你可以通过new PictureBox[this.Controls.Count(c => c is PictureBox)]
制作arrPictureBox,但你可以只做this.Controls.Where(c => c is PictureBox).toArray();
我的回答是作为一个快速示例,说明如何在表单上循环特定类型的控件,而不是一个完整的解决方案,假设这是在 Windows 表单上使用的(作为原始海报后来澄清)在他的cmets中。不知道为什么这值得对某人投反对票。另一个史蒂夫的解决方案是一种更优雅的方式来做类似的事情,但对于经验不足的人来说可能有点难以理解。【参考方案4】:
如果picChairN
是一个局部变量,那么您将无法尽可能简化它。你能做的最好的就是
arrPictureBox = new [] picChair0, picChair1, picChair2, picChair3,
picChair4, picChair5, picChair6, picChair7,
picChair8, picChair9, picChair10, picChair11;
如果picChairN
是类成员(例如由设计器创建的字段),那么您可以使用反射,但考虑到您已经输入了数组方法我没有看到太多好处。
【讨论】:
看起来picChairN
是一个表单控件(PictureBox
)。您可以遍历所有控件以获取所有以picChair
开头的图片框并将其添加到列表(如果需要,然后添加到 ToArray)。
如果是windows窗体应用程序是不是有可能从窗体对象或其他东西中获取所有typeof(picturebox)?
@RonBeyer 是的,但是您相信设计人员会正确命名控件并相信开发人员不会以会破坏逻辑的方式重命名控件。 可能,但我真的不明白将 12 项显式添加到数组有什么问题。
@AlexeiLevenkov 喜欢这里 50% 的问题是在没有研究的情况下完成的,所以我会说是的
@AlexeiLevenkov 也许是“阅读 OP 的思想”的 Carnac 帽子以上是关于用循环填充数组的主要内容,如果未能解决你的问题,请参考以下文章