/// <summary>
        /// For all DirectedEdges in result, form them into MaximalEdgeRings.
        /// </summary>
        /// <param name="dirEdges"></param>
        /// <returns></returns>
        private List <EdgeRing> BuildMaximalEdgeRings(IEnumerable <EdgeEnd> dirEdges)
        {
            var maxEdgeRings = new List <EdgeRing>();

            foreach (DirectedEdge de in dirEdges)
            {
                if (de.IsInResult && de.Label.IsArea())
                {
                    // if this edge has not yet been processed
                    if (de.EdgeRing == null)
                    {
                        var er = new MaximalEdgeRing(de, _geometryFactory);
                        maxEdgeRings.Add(er);
                        er.SetInResult();
                    }
                }
            }
            return(maxEdgeRings);
        }
        /// <summary>
        /// Form <see cref="DirectedEdge" />s in graph into Minimal EdgeRings.
        /// (Minimal Edgerings must be used, because only they are guaranteed to provide
        /// a correct isHole computation).
        /// </summary>
        /// <param name="dirEdges"></param>
        /// <returns></returns>
        private IList<EdgeRing> BuildEdgeRings(IEnumerable<EdgeEnd> dirEdges)
        {
            IList<EdgeRing> edgeRings = new List<EdgeRing>();
            foreach (DirectedEdge de in dirEdges)
            {
                // if this edge has not yet been processed
                if (de.IsInResult && de.EdgeRing == null)
                {
                    MaximalEdgeRing er = new MaximalEdgeRing(de, _geometryFactory);

                    er.LinkDirectedEdgesForMinimalEdgeRings();
                    IList<EdgeRing> minEdgeRings = er.BuildMinimalRings();
                    foreach(EdgeRing o in minEdgeRings)
                        edgeRings.Add(o);
                }
            }
            return edgeRings;
        }
 /// <summary> 
 /// For all DirectedEdges in result, form them into MaximalEdgeRings.
 /// </summary>
 /// <param name="dirEdges"></param>
 /// <returns></returns>
 private List<EdgeRing> BuildMaximalEdgeRings(IEnumerable<EdgeEnd> dirEdges)
 {
     var maxEdgeRings = new List<EdgeRing>();
     foreach (DirectedEdge de in dirEdges)
     {
         if (de.IsInResult && de.Label.IsArea())
         {
             // if this edge has not yet been processed
             if (de.EdgeRing == null)
             {
                 var er = new MaximalEdgeRing(de, _geometryFactory);
                 maxEdgeRings.Add(er);
                 er.SetInResult();
             }
         }
     }
     return maxEdgeRings;
 }