微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C# - 移动平均线

如何解决C# - 移动平均线

我对 C# 相当陌生,似乎找不到任何适合我的东西。 我需要从可以成功收集的串口获取数据。每次我单击按钮时,数据都会显示出来。 这个数据需要放在一个数组中,在这个数组上我想要计算移动平均值。

解决此问题的最佳方法是什么?

private void btnRead_Click(object sender,EventArgs e)
{            
    // Filtering incoming data from string to double
    string inComingData = serialPort.ReadLine();
    int charLoc = 0;
    int serialCharLoc = inComingData.IndexOf("N");

    while(!(inComingData.Contains("N")) && !(charLoc == serialCharLoc)) 
    {
        inComingData = serialPort.ReadLine();              
    }
    rtbIncoming.Text = inComingData;
    string [] usableData = inComingData.Split(' ');
    string correctData = usableData[1];
    tbData.Text = correctData;
    serialPort.discardInBuffer();

这是我现在从串口获取过滤数据的代码

解决方法

因此可以跟踪您拥有的每个数据:

public class MyClass // Don't know the name of your class 
{
   private readonly List<double> _values;
   
   public MyClass() 
   {
      _values = new List<double>();
   }

   // ...

   private void btnRead_Click(object sender,EventArgs e)
{            
    // Filtering incoming data from string to double
    string inComingData = serialPort.ReadLine();
    int charLoc = 0;
    int serialCharLoc = inComingData.IndexOf("N");

    while(!(inComingData.Contains("N")) && !(charLoc == serialCharLoc)) 
    {
        inComingData = serialPort.ReadLine();              
    }
    rtbIncoming.Text = inComingData;
    string [] usableData = inComingData.Split(' ');
    string correctData = usableData[1];
    tbData.Text = correctData;
    
    _values.Add(double.Parse(correctDate) // Only use "double.Parse" if you're sure it will be a double. If not use "double.TryParse".
    var average = _values.Average() // This will give you the average.
    var average2 = _values.TakeLast(x).Average() // This will give you the average for the last x items.
    
    serialPort.DiscardInBuffer();
}

如果您的元素数量非常多(我认为情况并非如此,因为只有当用户单击新元素时才会添加),则性能不会很好,因此您必须进行一些更改并按照建议进行操作如果注释保留一个累加器。

编辑:TakeLast 似乎引入了更多recently than I thought 这是您可以使用的自定义实现:

public static class LinqHelper
{
    public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> source,int count)
    {
        if (source == null)
        {
            throw new ArgumentNullException(nameof(source));
        }


        int from = count < 0 ? source.Count() : count > source.Count() ? 0 : source.Count() - count;
        for (int i = from; i < source.Count(); i++)
        {
            yield return source.ElementAt(i);
        }

    }
}

我试图尊重与现有行为相同的行为,但我认为实现仍然很幼稚,因此在某些情况下可能无法正常工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。