private void RemoveDuplicateRows(MeterData.HourlyTrendingSummaryDataTable table)
        {
            HashSet <int> ids = new HashSet <int>();

            for (int i = table.Count - 1; i >= 0; i--)
            {
                if (!ids.Add(table[i].ID))
                {
                    table.Rows.RemoveAt(i);
                }
            }
        }
        private void ProcessChannelNormals(MeterDataSet meterDataSet)
        {
            Dictionary <Channel, List <DataGroup> > trendingGroups;
            HourlyTrendingSummaryTableAdapter       hourlySummaryAdapter;

            MeterData.HourlyTrendingSummaryDataTable hourlySummaryTable;

            Channel channel;
            int     channelID;
            double  average;
            double  meanSquare;

            trendingGroups       = meterDataSet.GetResource <TrendingGroupsResource>().TrendingGroups;
            hourlySummaryAdapter = m_dbAdapterContainer.GetAdapter <HourlyTrendingSummaryTableAdapter>();
            hourlySummaryTable   = new MeterData.HourlyTrendingSummaryDataTable();

            hourlySummaryAdapter.ClearBeforeFill = false;

            foreach (KeyValuePair <Channel, List <DataGroup> > channelGroups in trendingGroups)
            {
                channel   = channelGroups.Key;
                channelID = channel.ID;
                hourlySummaryTable.Clear();

                foreach (DataGroup dataGroup in channelGroups.Value)
                {
                    hourlySummaryAdapter.FillBy(hourlySummaryTable, channelID, dataGroup.StartTime.AddHours(-1.0D), dataGroup.EndTime);
                }

                for (int i = hourlySummaryTable.Count - 1; i >= 0; i--)
                {
                    if (hourlySummaryTable[i].ValidCount + hourlySummaryTable[i].InvalidCount < channel.SamplesPerHour)
                    {
                        hourlySummaryTable.Rows.RemoveAt(i);
                    }
                }

                RemoveDuplicateRows(hourlySummaryTable);

                if (hourlySummaryTable.Count > 0)
                {
                    average    = hourlySummaryTable.Average(row => row.Average);
                    meanSquare = hourlySummaryTable.Average(row => row.Average * row.Average);

                    m_channelNormalTable.AddChannelNormalRow(channelID, average, meanSquare, 0.0D, hourlySummaryTable.Count);
                }
            }
        }
 public override void Prepare(DbAdapterContainer dbAdapterContainer)
 {
     m_dbAdapterContainer = dbAdapterContainer;
     m_hourlySummaryTable = new MeterData.HourlyTrendingSummaryDataTable();
     m_channelNormalTable = new MeterData.ChannelNormalDataTable();
 }