/// <summary>
 /// 
 /// </summary>
 /// <param name="p"></param>
 /// <param name="geom"></param>
 /// <returns></returns>
 private static bool ContainsPoint(Coordinate p, IGeometry geom)
 {
     if(geom is Polygon) 
         return ContainsPointInPolygon(p, (Polygon)geom);            
     else if(geom is GeometryCollection) 
     {
         IEnumerator geomi = new GeometryCollectionEnumerator((GeometryCollection)geom);
         while(geomi.MoveNext()) 
         {
             Geometry g2 = (Geometry)geomi.Current;
             // if(g2 != geom)  --- Diego Guidi say's: Java code tests reference equality: in C# with operator overloads we tests the object.equals()... more slower!                    
             if (!Object.ReferenceEquals(g2, geom)) 
                 if(ContainsPoint(p, g2))
                     return true;
         }
     }
     return false;
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="p"></param>
 /// <param name="geom"></param>
 private void ComputeLocation(Coordinate p, IGeometry geom)
 {
     if(geom is ILineString) 
         UpdateLocationInfo(Locate(p, (ILineString)geom));                                  
     else if(geom is IPolygon) 
         UpdateLocationInfo(Locate(p, (IPolygon)geom));            
     else if(geom is IMultiLineString) 
     {
         IMultiLineString ml = (IMultiLineString)geom;
         foreach(ILineString l in ml.Geometries)                     
             UpdateLocationInfo(Locate(p, l));                
     }
     else if(geom is IMultiPolygon)
     {
         IMultiPolygon mpoly = (IMultiPolygon)geom;
         foreach(IPolygon poly in mpoly.Geometries) 
             UpdateLocationInfo(Locate(p, poly));
     }
     else if (geom is IGeometryCollection) 
     {
         IEnumerator geomi = new GeometryCollectionEnumerator((IGeometryCollection)geom);
         while(geomi.MoveNext()) 
         {
             IGeometry g2 = (IGeometry)geomi.Current;
             if (g2 != geom)
                 ComputeLocation(p, g2);
         }
     }
 }
 /// <summary>
 /// 
 /// </summary>
 /// <returns></returns>
 public virtual bool MoveNext() 
 {
     if (_atStart) 
         return true;
     if (_subcollectionEnumerator != null) 
     {
         if (_subcollectionEnumerator.MoveNext())  
             return true;
         _subcollectionEnumerator = null;
     }
     if (_index >= _max) 
         return false;
     return true;
 }