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; } } } }