我在表上有一个包含60个值的数据库,这些值会自动每分钟填充一次。我有一个查询,第一次将采用这60个值并填充int
s。
然而,每分钟这个方法都是用SignalR执行的,逻辑应该是阵列的位置0应该用位置1替换,位置1用2替换等等,最后一个(59!)必须填充使用数据库中的最后一个值。
我不想每分钟重新创建一个数组,更不用说选择每次返回60行的数据库。
我的代码如下
public class Chart_Broadcaster
{
//The Line Chart Class
public class LineChart
{
[JsonProperty("lineChartData")]
private int[] lineChartData;
[JsonProperty("colorString")]
private string colorString;
[JsonProperty("hora")]
private string[] hora = new string[60];
public void SetLineChartData()
{
//Suppose we have a list of 60 items.
using (ZigBeeContext db = new ZigBeeContext())
{
var lista = (from p in db.Medidas orderby p.FechaHora descending
select p
).Take(60).ToList();
lineChartData = db.Medidas.Select(p => p.Temperatura).Cast<int>().ToArray();
hora = db.Medidas.Select(p => p.FechaHora).Cast<string>().ToArray();
}
}
}
}
答案 0 :(得分:1)
你仍然需要每分钟做一次SELECT,因为我假设你每分钟都有一个新行(如果没有那么你将不得不创建逻辑来只从数据库中选择新行)。只需将该行推入内存队列并将第一行排队。
请注意,创建一个长度为60的int数组是微不足道的,只需每分钟使用一次数据库调用就可以完全接受。
答案 1 :(得分:1)
一个不错的方法是使用队列而不是数组。来自MSDN docs:
表示先进先出的对象集合
这意味着您只需要将push个新项目放入队列的bacl,并将pop旧项目放在前面。没有必要担心每次都在一个地方定位和洗牌,因为这些都是为你处理的。
因此,当您获得要添加的新值时,您只需执行此操作:
//For example (you can't do this but it demonstrates the contents of the queue
var queue = new Queue<int> { 1, 2, 3, 4, 5 }
var newInt = 6;
queue.Enqueue(newInt);
var oldInt = queue.Dequeue(); //Or don't even bother storing it if you don't want it
另一个时髦的方法是使用.Net的反应性扩展(system.reactive)。这与SignalR作为排队系统很好地协同工作。