在处理表格合并等问题时,可以考虑采用位图算法实现二维存储对象的处理 
 
 
 
 
  
 
 

   通过Map.Set设置点值或Map.Fill填充区域。 
 
 
 

   判断各点值时通过Map.Get获取 
 
 
 
 
  
 
 

   扩展Point属性可以改成3维或更多维实现多维存储对象的处理 
 
 
 
 
  
 
 

        /// <summary> 
  
 
  

        /// 二维图形算法 
  
 
  

        /// 王洪岐 121226 
  
 
  

        /// </summary> 
  
 
  

        /// <typeparam name="T"></typeparam> 
  
 
  

        public class Map<T> 
  
 
  

        { 
  
 
  

            private Dictionary<Point, T> _map; 
  
 
  

            /// <summary> 
  
 
  

            /// 构建图 
  
 
  

            /// </summary> 
  
 
  

            /// <param name="x"></param> 
  
 
  

            /// <param name="y"></param> 
  
 
  

            public Map() 
  
 
  

            { 
  
 
  

                _map = new Dictionary<Point, T>(); 
  
 
  

            } 
  
 
  

            /// <summary> 
  
 
  

            /// 填充图 
  
 
  

            /// </summary> 
  
 
  

            /// <param name="a"></param> 
  
 
  

            /// <param name="b"></param> 
  
 
  

            public void Fill(Point a, Point b, T value) 
  
 
  

            { 
  
 
  

                for (int x = Math.Min(a.X, b.X); x <= Math.Max(a.X, b.X); x++) 
  
 
  

                { 
  
 
  

                    for (int y = Math.Min(a.Y, b.Y); y <= Math.Max(a.Y, b.Y); y++) 
  
 
  

                    { 
  
 
  

                        _map[new Point(x, y)] = value; 
  
 
  

                    } 
  
 
  

                } 
  
 
  

            } 
  
 
  

            /// <summary> 
  
 
  

            /// 设置单点值 
  
 
  

            /// </summary> 
  
 
  

            /// <param name="a"></param> 
  
 
  

            /// <param name="value"></param> 
  
 
  

            public void Set(Point p, T value) 
  
 
  

            { 
  
 
  

                _map[p] = value; 
  
 
  

            } 
  
 
  

            /// <summary> 
  
 
  

            /// 获取单点值 
  
 
  

            /// </summary> 
  
 
  

            /// <param name="p"></param> 
  
 
  

            /// <returns></returns> 
  
 
  

            public T Get(Point p) 
  
 
  

            { 
  
 
  

                return _map.ContainsKey(p) ? _map[p] : default(T); 
  
 
  

            } 
  
 
  

            /// <summary> 
  
 
  

            /// 显示点 
  
 
  

            /// </summary> 
  
 
  

            /// <returns></returns> 
  
 
  

            public string ShowPoint() 
  
 
  

            { 
  
 
  

                int intMaxX= _map.Keys.Max(p=>p.X); 
  
 
  

                int intMaxY= _map.Keys.Max(p=>p.Y); 
  
 
  

                StringBuilder sbReturn = new StringBuilder(); 
  
 
  

                for (int y = 0; y <= intMaxY; y++) 
  
 
  

                { 
  
 
  

                    for (int x = 0; x <= intMaxX; x++) 
  
 
  

                    { 
  
 
  

                        sbReturn.Append(_map.ContainsKey(new Point(x, y))?"1":"0"); 
  
 
  

                    } 
  
 
  

                    sbReturn.Append("\n"); 
  
 
  

                } 
  
 
  

                return sbReturn.ToString(); 
  
 
  

            } 
  
 
  

        } 
  
 
 

        /// <summary> 
  
 
  

        /// 点坐标 
  
 
  

        /// </summary> 
  
 
  

        public struct Point 
  
 
  

        { 
  
 
  

            private int _X; 
  
 
  

            private int _Y; 
  
 
  

            /// <summary> 
  
 
  

            ///  
  
 
  

            /// </summary> 
  
 
  

            /// <param name="x"></param> 
  
 
  

            /// <param name="y"></param> 
  
 
  

            public Point(int x, int y) 
  
 
  

            { 
  
 
  

                _X = x; 
  
 
  

                _Y = y; 
  
 
  

            } 
  
 
  

            /// <summary> 
  
 
  

            /// X 
  
 
  

            /// </summary> 
  
 
  

            public int X 
  
 
  

            { 
  
 
  

                get 
  
 
  

                { 
  
 
  

                    return _X; 
  
 
  

                } 
  
 
  

                set 
  
 
  

                { 
  
 
  

                    _X = value; 
  
 
  

                } 
  
 
  

            } 
  
 
  

            /// <summary> 
  
 
  

            /// Y 
  
 
  

            /// </summary> 
  
 
  

            public int Y 
  
 
  

            { 
  
 
  

                get 
  
 
  

                { 
  
 
  

                    return _Y; 
  
 
  

                } 
  
 
  

                set 
  
 
  

                { 
  
 
  

                    _Y = value; 
  
 
  

                } 
  
 
  

            } 
  
 
  

        }