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

时间:2009-11-17 19:24:13

标签: c# .net linq

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()调用?

2 个答案:

答案 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都有合理的理由

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;

Using