如何按名称获取列表
How do I get a List by name
本质上,我想做的是将控件添加到相应的列表 "row"+行,(无论行号在 for 循环中是什么),但是,我不能似乎找到了一种通过字符串获取列表引用的方法。我想知道是否有办法做到这一点。
List<PictureBox> row1 = new List<PictureBox>();
List<PictureBox> row2 = new List<PictureBox>();
List<PictureBox> row3 = new List<PictureBox>();
List<PictureBox> row4 = new List<PictureBox>();
List<PictureBox> row5 = new List<PictureBox>();
List<PictureBox> row6 = new List<PictureBox>();
List<PictureBox> row7 = new List<PictureBox>();
private void fillLists()
{
for (int col = 1; col < 7; col++)
{
for (int row = 1; row < 6; row++)
{
string name = "row_"+row+"_col_"+col;
PictureBox picture = (PictureBox)this.Controls[name];
// "row"+row.Add(picture);
}
}
}
编辑 1
- 添加了这个,看看它是否有效。谢谢大家的帮助!
private void fillLists()
{
for (int col = 1; col < 7; col++)
{
for (int row = 1; row < 6; row++)
{
string name = "row_" + row + "_col_" + col;
if (!rows.ContainsKey(row))
{
rows.Add(row, new List<PictureBox>());
}
rows[row].Add((PictureBox)this.Controls[name]);
}
}
使用字典来组合你所有的 collections:
var dict = new Dictionary<string, List<PictureBox>>
for(int i = 1; i < 8; i++)
{
dict.Add("row"+i, new List<PictureBox>);
}
然后通过以下方式访问它:
dict["row1"].Add(....);
既然你想知道怎么做,这里是如何使用反射来完成的:
class Program
{
List<object> myList1 = new List<object>();
List<object> myList2 = new List<object>();
List<object> myList3 = new List<object>();
List<object> myList4 = new List<object>();
List<object> myList5 = new List<object>();
List<object> myList6 = new List<object>();
static void Main(string[] args)
{
Program p = new Program();
p.Run();
Console.ReadLine();
}
void Run()
{
for (int i = 1; i <= 6; i++)
{
FieldInfo field = this.GetType().GetField("myList" + i, BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null)
{
List<object> value = field.GetValue(this) as List<object>;
if (value != null)
{
//You can use it here
}
else
{
//Wasn't found
}
}
}
}
}
请注意,这比仅将列表添加到字典并使用命名索引要慢得多。它确实演示了如何获取该字段,但这是一个控制台程序,可以 copy/pasted 到任何新的控制台项目中。
本质上,我想做的是将控件添加到相应的列表 "row"+行,(无论行号在 for 循环中是什么),但是,我不能似乎找到了一种通过字符串获取列表引用的方法。我想知道是否有办法做到这一点。
List<PictureBox> row1 = new List<PictureBox>();
List<PictureBox> row2 = new List<PictureBox>();
List<PictureBox> row3 = new List<PictureBox>();
List<PictureBox> row4 = new List<PictureBox>();
List<PictureBox> row5 = new List<PictureBox>();
List<PictureBox> row6 = new List<PictureBox>();
List<PictureBox> row7 = new List<PictureBox>();
private void fillLists()
{
for (int col = 1; col < 7; col++)
{
for (int row = 1; row < 6; row++)
{
string name = "row_"+row+"_col_"+col;
PictureBox picture = (PictureBox)this.Controls[name];
// "row"+row.Add(picture);
}
}
}
编辑 1 - 添加了这个,看看它是否有效。谢谢大家的帮助!
private void fillLists()
{
for (int col = 1; col < 7; col++)
{
for (int row = 1; row < 6; row++)
{
string name = "row_" + row + "_col_" + col;
if (!rows.ContainsKey(row))
{
rows.Add(row, new List<PictureBox>());
}
rows[row].Add((PictureBox)this.Controls[name]);
}
}
使用字典来组合你所有的 collections:
var dict = new Dictionary<string, List<PictureBox>>
for(int i = 1; i < 8; i++)
{
dict.Add("row"+i, new List<PictureBox>);
}
然后通过以下方式访问它:
dict["row1"].Add(....);
既然你想知道怎么做,这里是如何使用反射来完成的:
class Program
{
List<object> myList1 = new List<object>();
List<object> myList2 = new List<object>();
List<object> myList3 = new List<object>();
List<object> myList4 = new List<object>();
List<object> myList5 = new List<object>();
List<object> myList6 = new List<object>();
static void Main(string[] args)
{
Program p = new Program();
p.Run();
Console.ReadLine();
}
void Run()
{
for (int i = 1; i <= 6; i++)
{
FieldInfo field = this.GetType().GetField("myList" + i, BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null)
{
List<object> value = field.GetValue(this) as List<object>;
if (value != null)
{
//You can use it here
}
else
{
//Wasn't found
}
}
}
}
}
请注意,这比仅将列表添加到字典并使用命名索引要慢得多。它确实演示了如何获取该字段,但这是一个控制台程序,可以 copy/pasted 到任何新的控制台项目中。