public void ForEachFeatures(ShapeFileFeatureSource featureSource, Func <Feature, int, int, int, bool> process)
        {
            if (!featureSource.IsOpen)
            {
                featureSource.Open();
            }

            int currentProgress     = 0;
            int currentFeatureCount = featureSource.GetCount();

            for (int i = 0; i < currentFeatureCount; i++)
            {
                var currentFeature = featureSource.GetFeatureById((i + 1).ToString(), featureSource.GetDistinctColumnNames());
                if (process != null)
                {
                    currentProgress++;
                    var currentPercentage = currentProgress * 100 / currentFeatureCount;
                    var canceled          = process(currentFeature, currentProgress, currentFeatureCount, currentPercentage);
                    if (canceled)
                    {
                        break;
                    }
                }
            }
        }