如何在c#中的datagridview中找到最接近的值?

时间:2017-07-31 13:09:24

标签: c# algorithm winforms datagridview listbox

我有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
    }
  }
}

1 个答案:

答案 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);
}