检查列表中的值是否减少

时间:2013-10-22 10:51:26

标签: c# .net generic-collections

我有一个从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());
    }
}

DataGrid之前已经按照升序日期的时间顺序排序,这些是预期付款,因此列表中的余额应该减少。

我需要编写一些代码来检查当前列表项是否低于上一个列表项,但这是目前无法解决的问题,有人可以帮忙吗?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

尝试使用它,它将您的表放在一个列表中,使用zip方法可以比较值,选择那些当前值低于前一个值的值

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();

答案 2 :(得分:0)

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");

您需要确保这不是列表中的第一项,并且字符串可以转换为十进制,以使其起作用。

编辑:当然,您可以检查新项目是否低于上一项,之前将其放入余额列表中。

答案 3 :(得分:0)

嗯,使用懒惰的评估,只能达到第一次增加。

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