观察列表并继续进行过滤器匹配

时间:2017-05-08 16:14:59

标签: .net list linq design-patterns snapshot

这是一个我将加入类别"计算机科学500"在危险的墙上。 想象一下,你会有两个列表,你定期填写双值(即:每200ms)。每次添加新值时,都会计算其总和。如果达到预定义的限制(例如,最多:20个项目),而列表A添加了18个项目,列表B 20,则需要构建每个列表的总和并比较其两个值。哪个列表达到了最高金额?现在,想象一下在环型内存中使用的列表,其中最旧的条目被最新的double值替换。从那时起,已达到最大限制,每个新值都会导致函数调用以构建总和。 现在我的计算机科学问题/程序化方法: 哪个是正确且最有效地处理这个快速填充列表的最佳设计?该函数可能需要2s(如果它更复杂),我最感兴趣的是获得当前双值数据集的更新总和。恕我直言,我需要拍摄快照"当前列表(使用ToList),并计算其总和,但同时已添加新值。

我希望你能够对我提到的关于上述问题的意识流感到印象,并且可能有助于一些想法让灯泡闪烁高于我的头脑。

感谢收听。

编辑:

由于McCarthy先生的问题,坐在你的左侧第4排,我会给你一些代码片段,如果它有帮助,没问题,就像ALF会说的那样:

public class Score
{ 
     public double Score { get; set;};
     public double Timestamp { get; set;};
}

public class RootPool
{
       private int ID{ get; set;};
       private List<LeafPool> lstLeafs = new List<LeafPool>;

        public RootPool(int id, CallbackEventHandler callback)
       {
            ID = id;
            Callback = callback;
            lstLeafs = new List<LeafPool>;

            foreach (LeafPool lp in XMLSource)
            {
                LeafPool leaf = new LeafPool(lp.ID, lp_Callback);
                lstLeafs.Add(leaf);
            }

       }

        public delegate void CallbackEventHandler(int ID, double sumMax);
        public event CallbackEventHandler Callback;   


        void rp_Callback()
        {
             findSumMax();
        }



         private void findSumMax()
         {
             double sumMax = 0;
             //take snapshot
             List<LeafPool> SortedList = lstLeafs.OrderByDescending(l=>l.SUM).ToList();
             if (SortedList.Count > 0)
         {
             sumMax = SortedList[0].SUM;   

                if (Callback != null)
                Callback(ID, sumMax);             
             } 

         }


}

public class LeafPool
{
       private int ID { get; set;};
       private Score[] arrScore { get; set;};
       private double SUM { get; set;};

        public LeafPool (int id, CallbackEventHandler callback)
    { 
             ID = id;
             Callback = callback;
             arrScore = new Score[20];
        }

        public delegate void CallbackEventHandler();
        public event CallbackEventHandler Callback;   

        public void AddVal(Score valTime)
        {
        //find oldest entry
        int numEmpty = arrScore.Where(l => l == null).Count();

        if (numEmpty > 0)
        {
        var index = Array.IndexOf(arrScore, null);
            arrScore[index] = val;
        }

        else
        {
            var oldestEntry = arrScore.Select(l => l.Timestamp).Min()
            int index = myList.FindIndex(l.Timestamp == oldestEntry);

            arrScore[index] = val;

        }

        SUM = arrScore.Where(l => l != null).Sum();

        int numEmpty = arrScore.Where(l => l == null).Count();
        if (numEmpty == 0)
        {
          if (Callback != null)
                Callback();

        }
       }
}

public class Main
{
    private List<RootPool> lstRootPool = new List<RootPool>;
    //fill list by XML
     foreach (RootPool rp in XMLSource)
     {
          RootPool root = new RootPool(rp.ID, rp_Callback);
      lstRootPool.Add(rp);
     }

    //add Score values to Leaf pools
    lstRootPanel.Where(l => l.ID == 1).FirstOrDefault().lstLeafs.Where(l => l.ID == 101).FirstOrDefault().AddVal(score1);


     void rp_Callback(int ID, double sumMax)
        {
        //eval ID/sumMax tuple
                evalTuple(ID, sumMax);
        }
}

0 个答案:

没有答案