public static GroupDescriptor   getNewGroupDescriptor(DataItem aItem, int aPDULength, int aMaxAddress)
            {
                var lGroupDsc = new GroupDescriptor();

                lGroupDsc.mStart = aItem.Byte;
                lGroupDsc.setBufferSize(aItem, aPDULength, aMaxAddress);
                return(lGroupDsc);
            }
        private void                    optimize()
        {
            #region Sorting

            var lMemoryAreas = new SortedList <string, SortedDictionary <int, List <DataItem> > >(StringComparer.Ordinal);
            var lItemCount   = new SortedList <string, int>(StringComparer.Ordinal);
            var lMaxAddress  = new SortedList <string, int>(StringComparer.Ordinal);

            DataItem lItem;
            string   lAreaName;
            int      lMax;

            int lCount = mItemRWList.Count;
            for (int i = 0; i < lCount; i++)
            {
                lItem     = mItemRWList[i];
                lAreaName = lItem.mMemoryType.ToString();
                if (lItem.mMemoryType == EArea.DB)
                {
                    lAreaName = lAreaName + lItem.DB.ToString();
                }

                lMax = lItem.Byte + lItem.BufferLength - 1;

                if (lMemoryAreas.ContainsKey(lAreaName) == false)
                {
                    lMemoryAreas.Add(lAreaName, new SortedDictionary <int, List <DataItem> >());
                    lItemCount.Add(lAreaName, 0);
                    lMaxAddress.Add(lAreaName, lMax);
                }

                if (lMemoryAreas[lAreaName].ContainsKey(lItem.Byte) == false)
                {
                    lMemoryAreas[lAreaName].Add(lItem.Byte, new List <DataItem>());
                }

                lMemoryAreas[lAreaName][lItem.Byte].Add(lItem);
                lItemCount[lAreaName] = lItemCount[lAreaName] + 1;
                if (lMaxAddress[lAreaName] < lMax)
                {
                    lMaxAddress[lAreaName] = lMax;
                }

                lItem.mGroup = 0;
            }

            #endregion

            #region Grouping

            SortedDictionary <int, List <DataItem> > lArea;
            mGroups.Clear();
            mItemRWList.Clear();

            int             lGroupLastByte;
            int             lItemLastByte;
            GroupDescriptor lGroupDsc = null;
            int             lGroup    = 0;

            foreach (string lAreaName1 in lMemoryAreas.Keys)
            {
                lArea = lMemoryAreas[lAreaName1];
                foreach (int lByte in lArea.Keys)
                {
                    mItemRWList.AddRange(lArea[lByte]);
                }

                if (lItemCount[lAreaName1] > 1)
                {
                    foreach (int lByte in lArea.Keys)
                    {
                        foreach (DataItem lItem1 in lArea[lByte])
                        {
                            if (lGroupDsc == null)
                            {
                                lGroupDsc = GroupDescriptor.getNewGroupDescriptor(lItem1, mPDULength, lMaxAddress[lAreaName1]);
                                mGroups.Add(lGroupDsc);
                                lGroup = lGroup + 1;
                            }

                            lGroupLastByte = lGroupDsc.mStart + lGroupDsc.mBuffer.Length - 1;
                            lItemLastByte  = lItem1.Byte + lItem1.BufferLength - 1;

                            if (lGroupLastByte < lItemLastByte)
                            {
                                if (lItem1.Byte <= lGroupLastByte)
                                {
                                    lGroupDsc.setBufferSize(lItem1, mPDULength, lMaxAddress[lAreaName1]);
                                }
                                else
                                {
                                    lGroupDsc = GroupDescriptor.getNewGroupDescriptor(lItem1, mPDULength, lMaxAddress[lAreaName1]);
                                    mGroups.Add(lGroupDsc);
                                    lGroup = lGroup + 1;
                                }
                            }

                            lItem1.mGroup = lGroup;
                        }
                    }
                    lGroupDsc = null;
                }
            }

            #endregion
        }