如何处理Linq表达式中的IDisposableobject创建?

Linq允许您在查询表达式中创建新对象。 当您拥有封装列表生成的类时,这非常有用。 我想知道你是如何处理创建需要它的对象的?

例:

class Generator { public IEnumerable 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()调用?

好; 我希望这是巧合,但是: SelectMany; 结合IDisposable和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都有一个合理的理由)

的SelectMany

或者使用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; 

运用

听起来你不应该在每次迭代时创建一个新的Generator对象,原因如下:

  • 重复且快速地分配(并可能解除分配)内存非常低效。
  • Generator对象可能仅针对一个实例设计,以生成给定参数集的值。 当然,我可能错了,所以如有必要请澄清。

我建议你尝试以下方法:

 using (var gen = new Generator()) { var foo = from r in Enumerable.Range(1, 3) from g in gen.Gen(r) select g; }