代码之家  ›  专栏  ›  技术社区  ›  Jason

如何在Linq表达式内部处理IDisposableobject create?

  •  5
  • Jason  · 技术社区  · 16 年前

    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是IDisposable,我将如何获得Dispose()调用?

    2 回复  |  直到 16 年前
        1
  •  5
  •   Community Mohan Dere    9 年前

    好啊我希望这是巧合,但是: 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() 扩展方法(而不是 选择许多 ):

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

    Using

        2
  •  5
  •   Noldorin    16 年前

    Generator 对象,原因如下:

    • 这个 发电机 对象可能只为一个实例设计,以生成给定参数集的值。当然,我可能在这一点上是错的,所以请澄清,如果必要的话。

    我建议您尝试以下方法:

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