检查列表中的值是否递减
本文关键字:是否 列表 检查 | 更新日期: 2023-09-27 18:36:19
我有一个从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 之前已按升序日期的时间顺序排序,这些是预期付款,因此列表中的余额应该会减少。
我需要编写一些代码来检查当前列表项是否低于以前的列表项,但这目前让我无法理解,有人可以帮忙吗?
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;
}
}
}
尝试这样做,它会将您的表放在列表中,并使用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();
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");
.
您需要确保这不是列表中的第一项,并且字符串可以转换为十进制,以便使其正常工作。
编辑:当然,在将其放入余额列表之前,您可以检查新项目是否低于以前的项目。
erm,使用惰性求值,只到第一次增加。
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;
}