Vantalk
Vantalk

Reputation: 376

How can I compose variables names through loop in C#?

I have rewritten this question because not everyone understood. Hope it's ok, it's the same main problem.Very sorry

I have a winform with 15 progress bars called: "baraClasa1", "baraClasa2", "baraClasa3" ... "baraClasa15". I have to assign the .VALUE property (as in int) to all of them, from some database records. (The records access the different values from different time periods) I was thinking that maybe it is possible to use a loop to assign the .Value property to all of them by doing something like:

for(int i=0; i<value; i++)
{
   "baraClasa+i".Value = 20 + i;  
}

Is it possible to compose the name of the variables like that?

I don't know much about dictionaries, lists but looking into. If nothing works il just do the ugly:

int value = 20;
baraClasa1 = value;
baraClasa2 = value +1;....

Thank you for all help

Upvotes: 4

Views: 15832

Answers (8)

Bradley Gatewood
Bradley Gatewood

Reputation: 248

You have to do a little reflection.

    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
    }

No need to use reflection with the updated question. The control collection has a built in find for getting a control by the name string.

 for (int i = 0; i < 6; i++)
 {
   ProgressBar bar = (ProgressBar)this.Controls["baraClasa" + i.ToString()];
   bar.Value =  50;
 } 

Upvotes: 5

skolte
skolte

Reputation: 367

If you can put names of all variables in an array such as 'variable', and they are unique, you can try to use dictionary :

    Dictionary<object, object> dictionary = new Dictionary<string, object>();
    for(int i=0; i<value; i++)
    {
         dictionary.Add(variable[i], assign[i]);
    }

Upvotes: 0

Reut Sharabani
Reut Sharabani

Reputation: 31339

This is a design problem. Create a collection for items with common use (like progress bars for that matter) and iterate over the collection to perform actions on them.

If these are prorgress bars you might want to use an event-driven design (another link) to update their progress, meaning that each time a bar has made some progress, the event for the progress will send an update only to that bar, and not iterate over the entire list.

You may want to read an introduction to event driven programming in C# before re-factoring your code.

Upvotes: 4

David
David

Reputation: 218808

Arrays, lists, dictionaries, hash maps... collections in general are what you would use here. For example, if you have a dictionary, then it consists of key/value pairs. So a dictionary might look like this:

var variable = new Dictionary<int, string>();

Where the int is the key for any given entry, and the string is the value. You'd assign values in something like this:

for(int i = 0; i < value; i++)
    variable.Add(i, assign[i]);

Of course, since i is just an incrementing integer in this case (unless you have some other key in mind?), then it works just as well as an indexer on a list. Something like this:

var variable = new List<string>();
for (int i = 0; i < value; i++)
    variable.Add(assign[i]);

In both cases, you'd access the assigned value later by referencing its key (in a dictionary) or its index (in a list, or any array):

var someOtherVariable = variable[x];

Where x is an integer value present in the dictionary's keys or in the array's size.

Upvotes: 1

Selman Gen&#231;
Selman Gen&#231;

Reputation: 101681

No, you can't do it in C#, it's syntactically impossible. But if you want access form controls which has different names like this you can do the following:

for(int i=0; i<20; i++)
{
  var name = "variable" + i;
  this.Controls[name].Text = "etc..." // here you can access your control
}

Upvotes: 2

NWard
NWard

Reputation: 2086

If you want to have names for your objects, use a dictionary:

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]);
}

And then you can access them by doing, for example:

myDict["MyPattern1"]

However, I suggest you would be better off using a collection like a List or array.

Upvotes: 1

JaredPar
JaredPar

Reputation: 754545

It really isn't possible in C# to refer to local variables in a dynamic fashion as you are trying to do. Instead what you would do in C# is store the value in a dictionary where the key can be generated in a dynamic fashion.

For example let's say all of your variable1, variable2, ... variableN were of type int. Instead of

int variable1 = 0;
int variable2 = 0;
...
int variableN = 0;

You would instead do the following

Dictionary<string, int> map = new Dictionary<string, int>();
for (int i = 0;  i < N; i++) {
  map[i.ToString()] = 0;
}

If the values are a of a fixed number and always linear in progress it may make sense to use an array instead of a dictionary

int[] array = new int[N];
for (int i = 0; i < N; i++) {
  array[i] = 0;
}

Upvotes: 3

nvoigt
nvoigt

Reputation: 77285

You can't do it that way. You need an array. Every time you notice yourself having a variable2, you need an array. You may not know it yet, but you do.

Upvotes: 2

Related Questions