Question

I have a list populated from a DataGrid:

List<string> balances = new List<string>();

foreach (DataRow dr in dt.Rows)
{
    if((dr[1].ToString() != null) && (dr[1].ToString() != string.Empty))
    {
        balances.Add(dr[1].ToString());
    }
}

The DataGrid has been previously sorted into chronological order of ascending date, these are expected payments, so the balances in the list should decrease.

I need to write a bit of code to check if the current list item is lower than the previous list item, but this is currently eluding me, can someone help?

Was it helpful?

Solution

var lastBalance = decimal.MaxValue;
foreach (DataRow dr in dt.Rows)
{
    if (!string.IsNullOrEmpty(dr[1].ToString()))
    {
        var currentBalance = Convert.ToDecimal(dr[1]);
        if (currentBalance < lastBalance)
        {
            lastBalance = currentBalance;
            balances.Add(dr[1].ToString());
        }
        else
        {
            //TODO: Invalid list
            //throw ... OR
            break;
        }
    }
}

OTHER TIPS

try with this, it puts your table in a list, and with the zip method you can compare the values, selecting those that have the current value that is lower that the previous

List<DataRow> list = dt.AsEnumerable().ToList();
var result = list.Zip(list.Skip(1), 
(p, c) => new {current = c.fieldName, previous = p.fieldName})
.Where(f => f.current < f.previous)
.Select(a => a.current)
.ToList();

if (Convert.ToDecimal(balances[balances.Count - 1]) >= Convert.ToDecimal(balances[balances.Count -2]) MessageBox.Show("The new value is not lower than the previous","Error");.

You need to make sure this is not the first item in the list and that the String can convert to Decimal, in order for this to work.

EDIT: Of course, you could check if the new item is lower than the previous, before you put it in the balances list.

erm, uses lazy evaluation, only goes as far as the first increase.

  var last = decimal.MaxValue;
  var decreasing = true;
  foreach(var value in dataTable.AsEnumerable()
                            .Select(r => r.Field<string>(1))
                            .Where(s => !string.IsNullOrWhiteSpace(s))
                            .Select(Decimal.Parse))
  {
      if (last < value)
      {
          decreasing = false;
          break;
      }

      last = value;
  }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top