c# - 如何使用 C# Stack 对象保存日期时间值并计算平均值

标签 c# stack

首先概述一下我正在尝试做的事情:

每次用户按下一个键时,我都会记录当前时间,一旦我有超过 5 条记录,我需要计算两次按键之间的平均时间(同时只保留最后 5 - 10 次按键)。

当我第一次坐下来看这个问题时,我想,很简单,我将使用堆栈并简单地使其少于 10 个项目。

问题:

  • 如何确保堆栈中最多只有十个值? (日期时间类型)
  • 如何找到存储在堆栈中的每个日期时间之间的平均时间?

谢谢

最佳答案

不要使用Stack,而是使用容量有限的Queue。这可以通过类似的方式实现:

public class CappedQueue<T> : IEnumerable<T> {

    private readonly m_Capacity;
    private Queue<T> m_InnerQueue;
    public CappedQueue<T>(int capacity) {
        m_Capacity = capacity;
        m_InnerQueue = new Queue<T>(capacity);
    }

    // Wrap required methods 
    public void Enqueue(T item){
        if(m_InnerQueue.Count()) == capacity) {
            m_InnerQueue.Dequeue() ;                
        }

        m_InnerQueue.Enqueue(item);
    }

    public IEnumerator<T> GetEnumerator()
    {
        return m_InnerQueue.GetEnumerator();
    }
}


public class Test {
    public void Foo()
    {
        var queue = new CappedQueue<DateTime>(5);

        queue.Enqueue(DateTime.Now); // each time the user press the key
        queue.Enqueue(DateTime.Now); // each time the user press the key
        queue.Enqueue(DateTime.Now); // each time the user press the key


        TimeSpan diff = (queue.Last() / queue.Fisrt())/queue.Count();
    }
    public void Foo2()
    {
        var queue = new CappedQueue<int>(5);

        queue.Enqueue(10);
        queue.Enqueue(20);
        queue.Enqueue(30);

        var average = queue.Average(x=>x);
    }
}

关于c# - 如何使用 C# Stack 对象保存日期时间值并计算平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11274706/

相关文章:

c# - ASP.NET MVC 和 SQL SERVER 中的日期时间全局化

c# - 递归模型的 AutoMapper 条件映射

java - Java 中的子上下文在堆栈中是单独的行吗?

algorithm - 不使用堆栈/队列的非递归方式列出目录和子目录中的文件

java - 在offer方法中, "return stk1.push(element).equals(element)"是做什么的?

java - 尝试实现堆栈和括号匹配问题,但无法找出一些语义错误

c++ - 运行时检查失败 #2 - 变量 'a' 周围的堆栈已损坏

c# - ThrowUnobservedTaskExceptions 不工作

c# - 当前上下文中不存在变量?

c# - 如何配置 Teamcity 忽略一些测试