这是一个跟踪特定时期内添加到其中的元素的类。要使用它:
// creating
var q = new RecentQueue<Transaction>(TimeSpan.FromDays(360)); // last 360 days
var q = new RecentQueue<Transaction>(TimeSpan.FromSeconds(5)) // last 5 seconds
// adding elements
var t = new Transaction { Category = "cat1", TotalCost = "5",
TotalEarned = "3", TotalHST = "2" }
q.Enqueue(t);
// iterating
foreach (var element in q)
// do whatever
代码:
using System;
using System.Collections;
using System.Collections.Generic;
namespace MyCollections
{
public class RecentQueue<T> : IEnumerable<T>
{
class RecentItem<U>
{
public U Item { get; set; }
public DateTime Date { get; set; }
}
public TimeSpan Period { get; set; }
private Queue<RecentItem<T>> _q;
public RecentQueue(TimeSpan t)
{
Period = t;
_q = new Queue<RecentItem<T>>();
}
public void Enqueue(T t)
{
Enqueue(t, DateTime.Now);
}
public void Enqueue(T t, DateTime date)
{
Cut();
_q.Enqueue(new RecentItem<T> { Date = date, Item = t });
}
public IEnumerator<T> GetEnumerator()
{
Cut();
foreach (var element in _q)
yield return element.Item;
}
IEnumerator IEnumerable.GetEnumerator()
{
Cut();
foreach (var element in _q)
yield return element.Item;
}
private void Cut()
{
var date = DateTime.Now;
while (_q.Count > 0 && date - _q.Peek().Date > Period)
_q.Dequeue();
}
}
}
但是,我同意 couchand,“真正的”解决方案不是这个,也不是任何其他内存数据结构。它只是使用数据库,在日期上对其进行索引并进行查询。
我发布的课程实际上对一些在短时间内(最后几秒钟等)跟踪快速发生事件的应用程序更有用,因为你不想用请求打击数据库,你想要高性能,而且您不关心保存数据。
如果您要跟踪 360 天的数据,您需要一个数据库。