C# 从datagridview获取最接近的较低值

C# 从datagridview获取最接近的较低值,c#,winforms,datagridview,C#,Winforms,Datagridview,我试图根据用户的输入从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,程序将正确引

我试图根据用户的输入从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();
而且,我还需要捕获表中最接近的最低值(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();
var\u factorKeyLow=dgvKeyFactorTable.Rows.Cast()
。其中(r=>(十进制)r.Cells[0]。值(十进制)r.Cells[1]。值)
.FirstOrDefault();
var _keyFactorCoverageLow=dgvKeyFactorTable.Rows.Cast()
。其中(r=>(十进制)r.Cells[0]。值(十进制)r.Cells[0]。值)
.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;

FirstOrDefault返回序列的第一个元素。您正在从小于输入值的表项序列中检索第一个元素


对于小于的情况,可以使用LastOrDefault。这将返回序列的最后一个元素,只要序列从最小到最大排序,就应该是您要查找的元素。

此代码在
(十进制)r.Cells[0]处引发空引用异常。值try
(十进制?.r?.Cells?[0]?。值请注意,将所有问号放在任何地方都不好。只是做一下测试,看看它是否真的有效。逐个删除问号,尽量使用最少的问号。(除了
(十进制?
)。例如,如果有效,则将其从
r?
中删除。然后从
单元格中删除另一个?
,依此类推。直到得到null异常。这意味着您必须保留刚才删除的问号@Joecambareithat做到了
.LastOrDefault(r=>(十进制?)r.Cells[0]。值很高兴它有帮助!快乐编码;)@JoeCambareri
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;
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;