Append Loop Variable to Variable Name

1.3k views Asked by At

I have 5 DataTables that needs to be converted to TXT files. Instead of creating them separately, I thought I use a for loop. Here's my code:

StringBuilder sb = new StringBuilder();
for (int i = 1; i < 5; i++)
{
    DataTable dtFile1 = file1BLO.SelectFile1ForCSV()
    foreach (DataRow dr in dtFile1.Rows)
    {
        string[] fields = dr.ItemArray.Select(field => field.ToString()).ToArray();
        sb.AppendLine(string.Join("|", fields) + "|");
    }
    Response.ContentType = "application/text";
    Response.AddHeader("content-disposition", "attachment;filename=CAPRES-FILE1-"
                + DateTime.Now.ToString("yyyyMMdd-HHmmss") + ".txt");
    Response.Output.Write(sb);
    Response.Flush();
    Response.End();
    sb.Clear();
}

I would want the iterator to be appended to the variable names and methods. Like this DataTable dtFile + i = file + i + BLO.SelectFile + i + ForCSV();

Thanks!

Requested Code for SelectFile1ForCSV()

public DataTable SelectFile1ForCSV()
{
    return file1DAO.SelectFile1ForCSV();
}

EDIT: I am sorry, it seems that I haven't provided enough details, and my question has caused confusion. Edited now.

3

There are 3 answers

0
David Arno On BEST ANSWER

You cannot just append a number to a variable name at runtime to magically reference a new variable. What you should do instead is:

Define an an interface:

public interface IFileBLO
{
    DataTable SelectFileForCSV();
}

Have File1BLO, File2BLO etc all implement IFileBLO and fix the method names so that they are all SelectFileForCSV rather than SelectFile1ForCSV etc.

Add a lookup for reference these objects:

var bloList = new IFileBLO[]
{
    file1BLO, file2BLO, file3BLO, file4BLO, file5BLO
};

Finally, change your loop to:

for (int i = 0; i < 5; i++)
{
    var dtFile = bloList[i].SelectFileForCSV();
    foreach (var dr in dtFile.Rows)
    {
        ...
4
Dialecticus On

There are not enough information in the question to know exactly what the problem is, so I'm just guessing here. Your problem is that you have five objects, that all have a method, and these method have different names. The methods return the same thing, though, DataTable, that can be used in a loop.

If that's the case then just take out of the loop that which is different, so that in the loop remains that which is identical. Something like this:

DataTable[] fiveTables =
{
    file1BLO.SelectFile1ForCSV(),
    file2BLO.SelectFile2ForCSV(),
    file3BLO.SelectFile3ForCSV(),
    file4BLO.SelectFile4ForCSV(),
    file5BLO.SelectFile5ForCSV()
}

for (int i = 1; i <= 5; i++)
{
    // Use fiveTables[i] for DataTable, and i for file name
}
2
DrKoch On

Use this:

Response.AddHeader("content-disposition", "attachment;filename=CAPRES-FILE"
            + i
            + "-"
            + DateTime.Now.ToString("yyyyMMdd-HHmmss") + ".txt");

This will create a filename containing the value of i.