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