我已经重写了这个问题,因为不是每个人都理解。希望没关系,这是同样的主要问题。很抱歉
我有一个带有15个进度条的winform,名为:“baraClasa1”,“baraClasa2”,“baraClasa3”......“baraClasa15”。我必须从一些数据库记录中为所有这些属性分配.VALUE属性(如 int )。 (记录访问不同时间段的不同值) 我在想,也许可以通过执行以下操作来使用循环将.Value属性分配给所有这些:
for(int i=0; i<value; i++)
{
"baraClasa+i".Value = 20 + i;
}
是否可以组合这样的变量名称?
我不太了解字典,列表但是正在研究。如果没有任何作用,那就去做丑陋的事情:
int value = 20;
baraClasa1 = value;
baraClasa2 = value +1;....
感谢您的帮助
答案 0 :(得分:4)
这是一个设计问题。为常用项目(如进度条)创建一个集合,并迭代集合以对它们执行操作。
如果这些是prorgress栏,您可能需要使用event-driven design(another link)来更新他们的进度,这意味着每当一个栏有一些进展,进展的事件将发送一个仅更新到该栏,而不是遍历整个列表。
在重新分解代码之前,您可能需要阅读introduction to event driven programming in C#。
答案 1 :(得分:3)
在C#中,实际上不可能像您尝试的那样以动态方式引用局部变量。相反,你在C#中所做的就是将值存储在字典中,其中密钥可以以动态方式生成。
例如,假设您的所有variable1,variable2,... variableN都是int
类型。而不是
int variable1 = 0;
int variable2 = 0;
...
int variableN = 0;
您可以改为执行以下操作
Dictionary<string, int> map = new Dictionary<string, int>();
for (int i = 0; i < N; i++) {
map[i.ToString()] = 0;
}
如果值是固定数字并且始终是线性的,那么使用数组而不是字典可能是有意义的
int[] array = new int[N];
for (int i = 0; i < N; i++) {
array[i] = 0;
}
答案 2 :(得分:3)
你必须做一些反思。
public string variable0, variable1, variable2, variable3, variable4, variable5;
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 6; i++)
{
//pretending my variable names are variable1, variable2.. ("variable" is NOT an array! just the "assign" variable)
System.Reflection.FieldInfo info = this.GetType().GetField("variable" + i.ToString());
// replace "testing" with the value you want e.g. assign[i]
info.SetValue(this, "testing");
}
// Do something with your new values
}
无需对更新的问题使用反射。控件集合有一个内置的find,用于通过名称字符串获取控件。
for (int i = 0; i < 6; i++)
{
ProgressBar bar = (ProgressBar)this.Controls["baraClasa" + i.ToString()];
bar.Value = 50;
}
答案 3 :(得分:2)
你不能这样做。你需要一个数组。每当您发现自己拥有变量 2 时,您需要一个数组。你可能还不知道,但你做到了。
答案 4 :(得分:2)
不,你不能用C#做,它在语法上是不可能的。但是,如果您想要具有不同名称的访问表单控件,您可以执行以下操作:
for(int i=0; i<20; i++)
{
var name = "variable" + i;
this.Controls[name].Text = "etc..." // here you can access your control
}
答案 5 :(得分:1)
如果您想拥有对象的名称,请使用字典:
Dictionary<string, type> myDict = new Dictionary<string, type>()
string naming = "MyPattern{0}";
for (int i = 0; i <value; i++) {
myDict.add(string.Format(naming, i.ToString()), assign[i]);
}
然后您可以通过执行以下操作来访问它们,例如:
myDict["MyPattern1"]
但是,我建议你最好使用像List或数组这样的集合。
答案 6 :(得分:1)
数组,列表,字典,哈希映射......一般来说,这些集合都是你在这里使用的。例如,如果您有一个字典,那么它由键/值对组成。所以字典可能如下所示:
var variable = new Dictionary<int, string>();
int
是任何给定条目的关键字,string
是值。您可以使用以下内容分配值:
for(int i = 0; i < value; i++)
variable.Add(i, assign[i]);
当然,因为i
在这种情况下只是一个递增的整数(除非你还有其他一些键吗?),它的工作方式与列表中的索引器一样好。像这样:
var variable = new List<string>();
for (int i = 0; i < value; i++)
variable.Add(assign[i]);
在这两种情况下,您稍后通过引用其键(在字典中)或其索引(在列表或任何数组中)来访问指定的值:
var someOtherVariable = variable[x];
其中x
是字典键或数组大小中存在的整数值。
答案 7 :(得分:0)
如果你可以将所有变量的名称放在一个数组中,例如'variable',并且它们是唯一的,你可以尝试使用字典:
Dictionary<object, object> dictionary = new Dictionary<string, object>();
for(int i=0; i<value; i++)
{
dictionary.Add(variable[i], assign[i]);
}