public static IEnumerable <IGrouping <TKey, TSource> > IndexGroupBy <TKey, TSource>(this CSVDataSet <TSource> csvDataSet, Func <TSource, TKey> keySelector) { IndexManager <object, Segment> workingIndexManager = new IndexManager <object, Segment>(); string indexName = "TempGroup"; var innerEnumerable = csvDataSet.GetTypedEnumerable(1); foreach (TSource row in innerEnumerable) { var key = keySelector(row); Segment segment = csvDataSet.CurrentSegment; workingIndexManager.AddMapForKey(indexName, key, segment); } IndexTable <object, Segment> indexTable = workingIndexManager.GetMap(indexName); foreach (TKey key in indexTable.GetMapKeys()) { var source = csvDataSet.GetIndexedTypedEnumerable(indexName, key, workingIndexManager); yield return(new IndexGrouping <TKey, TSource>(key, source)); } workingIndexManager = null; }