我尝试按照此处的代码:
C# Finding Nearest Number in Array
但失败了。
与代码中的代码唯一不同的是我的代码中的MinBy是错误(有红色下划线),它在Visual Studio中显示错误。
顺便说一下,这是我写的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
double[] array = new double[5] { 0.25, 0.4, 0.5, 0.6, 0.7 };
double TargetNumber = Double.Parse(textBox1.Text);
var nearest = array.MinBy(x => Math.Abs((long)x - targetNumber));
label1.Text = nearest.ToString();
}
}
}
我是C#的新手。抱歉,这是一个菜鸟问题。 提前谢谢。
答案 0 :(得分:0)
有时候实现一个库只使用一个方法听起来有点像过度杀伤(即使MoreLINQ
是一个了不起的库)...这个代码应该为你提供相同的结果而不使用外部库,如果它是一个很好的解决方案:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication3
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Double[] array = new Double[] { 0.25, 0.4, 0.5, 0.6, 0.7 };
Double targ = Double.Parse(textBox1.Text);
Double[] arraySorted = array.OrderBy(x => Math.Abs(x - targ)).ToArray();
Int32 idx = Array.IndexOf(array,arraySorted.First());
label1.Text = idx.ToString();
Double arrayValue = array[idx];
Int32 idxLower = 0;
Int32 idxUpper = 0;
if (targ == arrayValue)
idxLower = idxUpper = idx;
else
{
if (targ > arrayValue)
{
idxLower = idx;
idxUpper = idx + 1;
}
else
{
idxLower = idx - 1;
idxUpper = idx;
}
}
label2.Text = idxLower.ToString();
label3.Text = idxUpper.ToString();
}
}
}
答案 1 :(得分:0)
你使事情过于复杂。这是你的"面包和黄油" helper方法,它从最接近传递值a
的数组d
中查找值:
private static double? FindNearestValue(IEnumerable<double> arr, double d)
{
var minDist = double.MaxValue;
double? nearestValue = null;
foreach (var x in arr)
{
var dist = Math.Abs(x - d);
if (dist < minDist)
{
minDist = dist;
nearestValue = x;
}
}
return nearestValue;
}
使用它:
private void button1_Click(object sender, EventArgs e)
{
double[] array = new double[5] { 0.25, 0.4, 0.5, 0.6, 0.7 };
double TargetNumber = Double.Parse(textBox1.Text);
var nearest = FindNearestValue(array, TargetNumber);
label1.Text = nearest.ToString(); // nulls are printed as empty string
}
对于小阵列,线性搜索具有与二进制搜索相当的速度。如果实施二进制搜索对您来说是个问题,并且您是c#
的新手(没有习惯LINQ权力),那么好的&#39; foreach
现在是你的朋友。