MrProgram
MrProgram

Reputation: 5242

Write for loop with same function as foreach

I have my foreach loop:

var i = 0;
foreach (DataRow data in result.Tables[0].Rows)
{
     var periodStartDate = Convert.ToDateTime(data.Table.Rows[i]["Date"].ToString().Remove(10));
     var periodEndDate = Convert.ToDateTime(data.Table.Rows[i]["Date"].ToString().Remove(0, 12));
     calc.PeriodStartDate = periodStartDate;
     calc.PeriodEndDate = periodEndDate;
     calc.InvoiceAmount = Convert.ToDecimal(data.Table.Rows[i]["Invoice amount"].ToString());
     calc.InterestRate = Convert.ToDecimal(data.Table.Rows[i]["Interest rate"].ToString());
     calc.InterestAmount = Convert.ToDecimal(data.Table.Rows[i]["Interest amount"].ToString());
     calc.Amortization = Convert.ToDecimal(data.Table.Rows[i]["Amortization"].ToString());
     calc.PresentValue = Convert.ToDecimal(data.Table.Rows[i]["Capital balance"].ToString());
     calc.StartValue = Convert.ToDecimal(data.Table.Rows[0]["Capital balance"].ToString());
     cList.Add(calc);
     i++;
}

I wanna do the same but in a for loop instead. Tried this (don't work because it can't find data (obviously):

for (int i = 0; i < result.Tables[0].Rows.Count; i++)
{
     var periodStartDate = Convert.ToDateTime(data.Table.Rows[i]["Date"].ToString().Remove(10));
     var periodEndDate = Convert.ToDateTime(data.Table.Rows[i]["Date"].ToString().Remove(0, 12));
     calc.PeriodStartDate = periodStartDate;
     calc.PeriodEndDate = periodEndDate;
     calc.InvoiceAmount = Convert.ToDecimal(data.Table.Rows[i]["Invoice amount"].ToString());
     calc.InterestRate = Convert.ToDecimal(data.Table.Rows[i]["Interest rate"].ToString());
     calc.InterestAmount = Convert.ToDecimal(data.Table.Rows[i]["Interest amount"].ToString());
     calc.Amortization = Convert.ToDecimal(data.Table.Rows[i]["Amortization"].ToString());
     calc.PresentValue = Convert.ToDecimal(data.Table.Rows[i]["Capital balance"].ToString());
     calc.StartValue = Convert.ToDecimal(data.Table.Rows[0]["Capital balance"].ToString());
     cList.Add(calc);
}

How can I re-write my for loop so it matches my foreach loop?

Upvotes: 0

Views: 119

Answers (3)

Sriram Sakthivel
Sriram Sakthivel

Reputation: 73472

In first place you're using foreach itself wrong. You already have DataRow and still you're having a counter, etc etc they are not required.

foreach (DataRow data in result.Tables[0].Rows)
{
     var periodStartDate = Convert.ToDateTime(data["Date"].ToString().Remove(10));
     //You can simplify rest like this with `data`
}

for (int i = 0; i < result.Tables[0].Rows.Count; i++)
{    
    DataRow data = result.Tables[0].Rows[i];
    var periodStartDate = Convert.ToDateTime(data["Date"].ToString().Remove(10)); 
    //And so on   
}

Upvotes: 1

Luaan
Luaan

Reputation: 63732

var table = result.Tables[0];

for (int i = 0; i < table.Rows.Count; i++)
{
     var periodStartDate = Convert.ToDateTime(table.Rows[i]["Date"].ToString()
                                  .Remove(10));
     var periodEndDate   = Convert.ToDateTime(table.Rows[i]["Date"].ToString()
                                  .Remove(0, 12));

     // And the rest of the fields...

     cList.Add(calc);
}

Or, of course, you can simply use LINQ:

var cList = 
  result.Tables[0].Rows.Select
  (
    (row, index) =>
    {
      var calc = new YourCalc();

      calc.Something = row["SomeField"] as SomeType;

      return calc;
    }
  ).ToList();

Upvotes: 0

Sudhakar Tillapudi
Sudhakar Tillapudi

Reputation: 26209

You need to get the DataRow for each iteration .

Add the following statement in forloop as first statement:

DataRow data = result.Tables[0].Rows[i];

Complete Code:

for (int i = 0; i < result.Tables[0].Rows.Count; i++)
{
     DataRow data = result.Tables[0].Rows[i];
     var periodStartDate = Convert.ToDateTime(data.Table.Rows[i]["Date"].ToString().Remove(10));
     var periodEndDate = Convert.ToDateTime(data.Table.Rows[i]["Date"].ToString().Remove(0, 12));
     calc.PeriodStartDate = periodStartDate;
     calc.PeriodEndDate = periodEndDate;
     calc.InvoiceAmount = Convert.ToDecimal(data.Table.Rows[i]["Invoice amount"].ToString());
     calc.InterestRate = Convert.ToDecimal(data.Table.Rows[i]["Interest rate"].ToString());
     calc.InterestAmount = Convert.ToDecimal(data.Table.Rows[i]["Interest amount"].ToString());
     calc.Amortization = Convert.ToDecimal(data.Table.Rows[i]["Amortization"].ToString());
     calc.PresentValue = Convert.ToDecimal(data.Table.Rows[i]["Capital balance"].ToString());
     calc.StartValue = Convert.ToDecimal(data.Table.Rows[0]["Capital balance"].ToString());
     cList.Add(calc);
}

Upvotes: 1

Related Questions