[英]how to find closest value in datagridview in c#?
我有1个数据网格视图和1个列表框。 在数据网格视图中,我收集了如下数据:
10
13
16
19
22
25
28
31
34
37
42
...
我想从数据网格视图中获取值,将其划分为10或除以10时得出的差异最小。根据上述数据示例,我想添加到列表框中的数据;
10
19
31
42
...
这是我的代码; EDITED
private void btnAccModeStop_Click(object sender, EventArgs e)
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if(Convert.ToDouble(dataGridView1.Rows[i].Cells[0].Value)%10==0)
{
listBoxACC.Items.Add(dataGridView1.Rows[i].Cells[0].Value.ToString());
}
else if(Convert.ToDouble(dataGridView1.Rows[i].Cells[0].Value)%10!=0);
{
// I don't know what I should write here
}
}
}
老实说,我很难理解您的问题,但是我想我已经明白了。
基本上,对于10, 20, 30, 40, 50, ...
您想要列表中最接近右边的值。
这正是我要做的。 不是遍历网格中的项目列表,而是遍历目标值。 您可以像这样实现期望
private IEnumerable<int> GetValuesClosestToMultiplesOfTen(IEnumerable<int> input)
{
foreach(var multipleOfTen in GetMultiplesOfTenUpTo(input.Max())
{
yield return GetClosestValue(input, multipleOfTen);
}
}
该方法迭代IEnumerable<int>
的10的倍数,并返回input
列表中最接近的值。
当然,您也必须实现以下两种方法
private IEnumerable<int> GetMultiplesOfTenUpTo(int upTo)
{
int remainder = upTo % 10;
if(remainder < 5)
{
upTo = (upTo / 10) * 10; // is rounded to the next lower multiple of 10
}
else
{
upTo = (upTo / 10) * 10 + 10; // to the next higher multiple of ten
}
for(int multiple = 10; multiple <= upTo; multiple += 10)
{
yield return multiple;
}
}
private int GetClosestValue(IEnumerable<int> input, int targetValue)
{
return input.Select(i => new{Value = i, Distance = i-targetValue})
.OrderBy(x => Math.Abs(x.Distance))
.First().Value;
}
这绝对不是最优雅或性能最高的解决方案,但这应该可以解决。 (除了19和21与20的距离相同的可能性之外,您还必须使算法适应您的平均值。)
请注意:在某些情况下,此代码可能会产生重复的条目。 如果不希望出现这种情况,则必须处理这种情况,例如,通过删除小于10的最后一个倍数的值。
编辑
您可以使用此代码段从DataGridView获取值
var values = dataGridView.Rows
.OfType<DataGridViewRow>()
.Select(r => Convert.ToInt32(r.Cells[0].Value))
接着
var closestToMultiplesOfTen = GetValuesClosestToMultiplesOfTen(values);
foreach(var item in closestToMultiplesOfTen)
{
listBox.Items.Add(item);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.