簡體   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