我有1个数据网格视图和1个列表框。在数据网格视图中,我收集了类似的数据:
10
13
16
19
22
25
28
31
34
37
42
...
我想从数据网格视图到列表框中取值,这些值可以分为10或者除以10时给出最小的差值。我想根据上面的数据示例添加到列表框中的数据; < / p>
10
19
31
42
...
这是我的代码; 已编辑
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
}
}
}
答案 0 :(得分:1)
老实说,我很难解读你的问题,但我想我现在已经得到了。
基本上,对于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具有相同距离的可能性之外 - 你必须使算法适应你的手段。)
请注意:在某些情况下,此代码可能会产生重复的条目。如果不希望出现这种情况,您将不得不处理这种情况,例如:删除低于十的最后一个倍数的值。
修改强>
您可以使用此代码段从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);
}