2016-08-25 1 views
2

У меня есть база данных с 60 значениями на таблице, значения заполняются каждую минуту автоматически. У меня есть запрос, который в первый раз примет эти 60 значений и заполнит массив int s.Как вытеснить один массив значений int?

Однако каждую минуту этот метод выполняется с помощью 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(); 

      } 
     } 
    } 
} 
+1

Используйте ['Queue '] (https://msdn.microsoft.com/en-us/library/7977ey2c (v = vs.110) .aspx) вместо массива, возможно? – DavidG

ответ

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 

Другой фанки метод должен был бы использовать Reactive Extensions для .Net (). Это хорошо работает с SignalR в качестве системы очередей.

1

Посмотрите в Queue class.

Вы бы все равно придется делать SELECT, каждую минуту, так как я предполагаю, что вы будете иметь новую строку каждую минуту (если нет, тогда вам нужно будет создать логику только для SELECT новых строк из базы данных). Просто нажмите эту строку в очередь в памяти и де-очередь в первой строке.

Просто FYI, что создание массива int длиной 60 является тривиальным и просто делает это каждую минуту с вызовом базы данных, совершенно приемлемым для меня.

+2

Вы имели в виду ссылку на старый класс queue, а не новую родовую версию? – DavidG

+0

@ DavidG хорошо пятнистый! – Wurd

Смежные вопросы