从datagridview获取最接近的较低值
本文关键字:最接近 datagridview 获取 | 更新日期: 2023-09-27 18:19:13
我正试图根据用户的输入从datagridview中检索最接近的较低值。
例如,我有以下两行数据:dgvKeyFactorTable.Rows.Add(new object[] { 00000m, 1.000m });
dgvKeyFactorTable.Rows.Add(new object[] { 150000m, 1.873m });
dgvKeyFactorTable.Rows.Add(new object[] { 155000m, 1.938m });
如果用户输入150000,程序用下面的语句正确引用1.873:
var _factorKeyVariable = this.dgvKeyFactorTable.Rows.Cast<DataGridViewRow>()
.Where(r=>(decimal)r.Cells[0].Value == decimal.Parse(txtCoverageA.Text))
.Select(r=>(decimal)r.Cells[1].Value)
.FirstOrDefault();
factorKey = _factorKeyVariable;
lblKeyFactor.Text = factorKey.ToString();
但是,我需要能够让用户在此表中的值之间输入一个数字-例如,153500,并让程序根据公式设置factorKey
变量。
为了使公式成功,我需要引用最接近的最高数字(155000 &1.938)我在这里成功地做到了:
var _factorKeyHigh = dgvKeyFactorTable.Rows.Cast<DataGridViewRow>()
.Where(r => (decimal)r.Cells[0].Value >= decimal.Parse(txtCoverageA.Text))
.Select(r => (decimal)r.Cells[1].Value)
.FirstOrDefault();
var _keyFactorCoverageHigh = dgvKeyFactorTable.Rows.Cast<DataGridViewRow>()
.Where(r => (decimal)r.Cells[0].Value >= decimal.Parse(txtCoverageA.Text))
.Select(r => (decimal)r.Cells[0].Value)
.FirstOrDefault();
并且,我还需要捕获表中最接近的最低值(150000 &1.873)。这就是我遇到麻烦的地方。我正在使用以下代码尝试这样做:
var _factorKeyLow = dgvKeyFactorTable.Rows.Cast<DataGridViewRow>()
.Where(r => (decimal)r.Cells[0].Value <= decimal.Parse(txtCoverageA.Text))
.Select(r => (decimal)r.Cells[1].Value)
.FirstOrDefault();
var _keyFactorCoverageLow = dgvKeyFactorTable.Rows.Cast<DataGridViewRow>()
.Where(r => (decimal)r.Cells[0].Value <= decimal.Parse(txtCoverageA.Text))
.Select(r => (decimal)r.Cells[0].Value)
.FirstOrDefault();
但是,这总是返回表0,1.000中的最低值。我不知道为什么这不起作用,有人能提供一些见解吗?
为了获得最高的分数,你可以这样做。我已经简化了查询,使其更具可读性,也更快。因为你不需要两次找到一个项目。
var highfactor= dgvKeyFactorTable.Rows.Cast<DataGridViewRow>()
.FirstOrDefault(r => (decimal)r.Cells[0].Value >= decimal.Parse(txtCoverageA.Text));
var _keyFactorCoverageHigh = (decimal)highfactor.Cells[0].Value;
var _factorKeyHigh = (decimal)highfactor.Cells[1].Value;
但是要得到最低的,记住00000m, 1.000m
也比150000m, 1.873m
低,所以FirstOrDefault();
会给你这个,因为它是第一个发现。相反,使用LastOrDefault();
来获取最接近的项目。
请注意,LastOrDefault
也会给您第一个查找,但它将从末尾开始搜索。
var lowfactor= dgvKeyFactorTable.Rows.Cast<DataGridViewRow>()
.LastOrDefault(r => (decimal)r.Cells[0].Value <= decimal.Parse(txtCoverageA.Text));
var _keyFactorCoverageLow = (decimal)lowfactor.Cells[0].Value;
var _factorKeyLow = (decimal)lowfactor.Cells[1].Value;
FirstOrDefault返回序列的第一个元素。您正在从小于输入值的表项序列中检索第一个元素。
对于小于的情况,可以使用LastOrDefault。这将返回序列的最后一个元素,并且应该是您要查找的,只要该序列从最小到最大排序。