繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM