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

Jas*_*son 5 .net c# 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将创建3个Generator对象,这些对象将在某个时刻被垃圾收集.如果Generator是IDisposable,我将如何获得Dispose()调用?

Nol*_*rin 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;
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 5

好; 我希望这是巧合,但是: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;
Run Code Online (Sandbox Code Playgroud)

(请注意,我假设有一个合理的理由来执行此操作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;
Run Code Online (Sandbox Code Playgroud)

运用