如何通过C#中的循环组合变量名?

时间:2014-01-03 16:35:41

标签: c# winforms loops variables

我已经重写了这个问题,因为不是每个人都理解。希望没关系,这是同样的主要问题。很抱歉

我有一个带有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;....

感谢您的帮助

8 个答案:

答案 0 :(得分:4)

这是一个设计问题。为常用项目(如进度条)创建一个集合,并迭代集合以对它们执行操作。

如果这些是prorgress栏,您可能需要使用event-driven designanother 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]);
    }