从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中的最低值。我不知道为什么这不起作用,有人能提供一些见解吗?

从datagridview获取最接近的较低值

为了获得最高的分数,你可以这样做。我已经简化了查询,使其更具可读性,也更快。因为你不需要两次找到一个项目。

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。这将返回序列的最后一个元素,并且应该是您要查找的,只要该序列从最小到最大排序。