public void SetContent(List <ClrJob> clrJobs, ClrJobType type)
        {
            _valuesSeries = new List <ChartClrJob>(clrJobs.Count);

            ChartClrJob lastItem = null;

            foreach (ClrJob job in clrJobs)
            {
                if (job.Type != type)
                {
                    continue;
                }

                ulong startMilliseconds = job.StartNanoseconds / 1000000;
                ulong endMilliseconds   = job.EndNanoseconds / 1000000;

                if ((lastItem != null) && (startMilliseconds <= lastItem.EndMilliseconds))
                {
                    if (endMilliseconds > lastItem.EndMilliseconds)
                    {
                        lastItem.EndMilliseconds = endMilliseconds;
                    }
                    continue;
                }

                if (startMilliseconds == endMilliseconds)
                {
                    ++endMilliseconds;
                }

                lastItem = new ChartClrJob
                {
                    StartMilliseconds = startMilliseconds,
                    EndMilliseconds   = endMilliseconds,
                };

                _valuesSeries.Add(lastItem);
            }

            _valuesSeries.Capacity = _valuesSeries.Count;

            UpdateViewPort();
        }
        protected List <ClrJobItem> GetViewPortValuesOrg(Tuple <int, int> region)
        {
            if (region == null)
            {
                return(new List <ClrJobItem>());
            }

            int start = region.Item1;
            int end   = region.Item2;
            int count = end - start;

            var         compressed = new List <ChartClrJob>();
            ChartClrJob lastItem   = null;

            ulong min = (ulong)((ViewPortMaxValueMilliseconds - ViewPortMinValueMilliseconds) / Width);

            for (var i = start; i < end; i++)
            {
                if (lastItem == null)
                {
                    lastItem = new ChartClrJob
                    {
                        StartMilliseconds = _valuesSeries[i].StartMilliseconds,
                        EndMilliseconds   = _valuesSeries[i].EndMilliseconds
                    };
                    compressed.Add(lastItem);
                    continue;
                }

                if ((_valuesSeries[i].StartMilliseconds - lastItem.EndMilliseconds) < min)
                {
                    lastItem.EndMilliseconds = _valuesSeries[i].EndMilliseconds;
                    continue;
                }

                lastItem = new ChartClrJob
                {
                    StartMilliseconds = _valuesSeries[i].StartMilliseconds,
                    EndMilliseconds   = _valuesSeries[i].EndMilliseconds
                };

                compressed.Add(lastItem);
            }

            var result = new List <ClrJobItem> {
                new ClrJobItem()
            };

            foreach (ChartClrJob clrJob in compressed)
            {
                result.Add(new ClrJobItem
                {
                    TimeMilliseconds = clrJob.StartMilliseconds,
                    Value            = 0
                });
                result.Add(new ClrJobItem
                {
                    TimeMilliseconds = clrJob.StartMilliseconds,
                    Value            = 1
                });
                result.Add(new ClrJobItem
                {
                    TimeMilliseconds = clrJob.EndMilliseconds,
                    Value            = 1
                });
                result.Add(new ClrJobItem
                {
                    TimeMilliseconds = clrJob.EndMilliseconds,
                    Value            = 0
                });
            }

            result.Add(new ClrJobItem
            {
                TimeMilliseconds = ViewPortMaxValueMilliseconds + 1,
                Value            = 0
            });

            return(result);
        }