如何替换一个int值数组?

时间:2016-08-25 14:08:55

标签: c# arrays algorithm entity-framework linq

我在表上有一个包含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();

            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

查看Queue class.

你仍然需要每分钟做一次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的反应性扩展()。这与SignalR作为排队系统很好地协同工作。