我尝试在Array中找到最接近的double

时间:2017-11-24 22:29:59

标签: c#

我尝试按照此处的代码:

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#的新手。抱歉,这是一个菜鸟问题。 提前谢谢。

2 个答案:

答案 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现在是你的朋友。