将集合从IGrouping转换为IEnumerable

时间:2014-12-29 17:04:32

标签: c# linq

我有数百万个元素的非常大的集合。我需要将所有内容保存为IEnumerable,否则我会得到一个OutOfMemoryException。 我的问题是我必须做一些这样的分组:

IEnumerable<MyClass> mycollection = dao.RetrieveBigCollection-();
var mycollection = mycollection.GroupBy(x => x.Date1);

稍后在程序中,该集合将由一些使用反射的库提取。问题是,在分组后,集合的类型为IGrouping,并且此库需要IEnumerable<MyClass>。我需要将它转换回IEnumerable<MyClass>,我的约束是我不能调用ToList(),否则我得到一个OutOfMemoryException。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

GroupBy返回IEnumerable<IGrouping<TKey, TSource>>,您可以展平

groupings.SelectMany(x => x);

但是,你仍然会遇到内存问题,因为分组内部会将一个集合保存在内存中,所以无论如何你的整个枚举都会被拉入内存。

答案 1 :(得分:1)

嗯,现在已经很晚了,但是对于其他可能会来看的人,你应该可以使用Select

IEnumerable<MyClass> mycollection = dao.RetrieveBigCollection-();
var mycollection = mycollection.GroupBy(x => x.Date1)
                               .Select(xg => xg.Select(x => x));

结果将是IEnumerable<IEnumerable<MyClass>>