从datagridview获取最接近的较低值

时间:2015-10-26 13:50:26

标签: 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,程序将使用以下语句正确引用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&amp; 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&amp; 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。我不确定为什么这不起作用,有人能提供一些见解吗?

2 个答案:

答案 0 :(得分:1)

要获得最高分,你可以做到这一点。我已经简化了查询,因此它更具可读性,也更快。因为你不必两次找到一件物品。

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;

答案 1 :(得分:1)

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

您可以使用LastOrDefault代替小于大小写。这将返回序列的最后一个元素,并且只要序列从最小到最大排序,它就应该是您要查找的元素。