Linq允许您在查询表达式中创建新对象。当您具有封装列表生成的类时,这非常有用。我想知道你是如何处理那些需要它的对象?
示例:
class Generator
{
public IEnumerable<int> Gen(int size)
{
return Enumerable.Range(0, size);
}
}
class bar
{
public void doit()
{
var foo =
from r in Enumerable.Range(1, 3)
from g in new Generator().Gen(r)
select g;
}
}
这将创建3个Generator对象,这些对象将在某个时刻被垃圾收集。如果Generator是IDisposable,我将如何获得Dispose()调用?
答案 0 :(得分:5)
听起来你不应该在每次迭代时创建一个新的Generator
对象,原因有两个:
Generator
对象可能只针对一个实例设计,以生成给定参数集的值。当然,我可能错了,所以如有必要请澄清。我建议你尝试以下方法:
using (var gen = new Generator())
{
var foo =
from r in Enumerable.Range(1, 3)
from g in gen.Gen(r)
select g;
}
答案 1 :(得分:5)
行;我希望这是巧合,但是:SelectMany; combining IDisposable and LINQ,(使用自定义SelectMany
实现)将允许:
var foo =
from r in Enumerable.Range(1, 3)
from gen in new Generator()
from g in gen.Gen(r)
select g;
(请注意,我假设每个r
都有合理的理由
或使用Using()
扩展方法(而不是SelectMany
):
var foo =
from r in Enumerable.Range(1, 3)
from gen in new Generator().Using()
from g in gen.Gen(r)
select g;