在Linq中处理IDisposable

在Linq中处理IDisposable,linq,extension-methods,idisposable,Linq,Extension Methods,Idisposable,(这是对问题答案的评论的后续内容) 在我发布它18个月后,有人在中发现了一个bug,我在一个方法链的中途使用了一个IDisposable,但它从未被处理过 我试图编写一个扩展方法来处理此问题: public static IEnumerable<R> Using<T, R>( this IEnumerable<T> list, Func<T, R> selector) where R : IDisposable { foreach

(这是对问题答案的评论的后续内容)

在我发布它18个月后,有人在中发现了一个bug,我在一个方法链的中途使用了一个IDisposable,但它从未被处理过

我试图编写一个扩展方法来处理此问题:

public static IEnumerable<R> Using<T, R>(
     this IEnumerable<T> list, Func<T, R> selector) where R : IDisposable
{
    foreach(var item in list)
        using(var disposable = selector(item))
            yield return disposable;
}

var q = Enumerable.Range(0, 10)
        .Using(i => new Disposable(i))
        .Select(d => d.Id);

像这样?我在这里并没有太大的改变,除了构造器的用法

    static void Main()
    {
        var q = from d in System.Linq.Enumerable.Range(0, 10)
                select new Disposable(d);
    //  alternatively:
    //  var q = System.Linq.Enumerable.Range(0, 10)
    //          .Select(d => new Disposable(d));

        foreach(var item in q)
        {
            Console.WriteLine("Hi");
        }
    }
    public static IEnumerable<R> Select<T, R>(
        this IEnumerable<T> list, Func<T, R> selector) where R : IDisposable
    {
        foreach (var item in list)
            using (var disposable = selector(item))
                yield return disposable;
    }
static void Main()
{
var q=System.Linq.Enumerable.Range(0,10)中的d
选择新的一次性(d);
//或者:
//var q=System.Linq.Enumerable.Range(0,10)
//.选择(d=>新的一次性(d));
foreach(q中的var项目)
{
控制台。WriteLine(“Hi”);
}
}
公共静态IEnumerable Select(
这是IEnumerable列表,Func选择器),其中R:IDisposable
{
foreach(列表中的变量项)
使用(var=选择器(项目))
一次性收益率;
}

然而!这里需要注意的是,我们没有引入任何冲突的LINQ操作。

所以我的扩展方法隐藏了内置方法,所以我基本上是为了其他目的而“破坏”了Select?我有点希望编译器能够分辨出两者的区别。你的SelectMany也有同样的问题吗?
    static void Main()
    {
        var q = from d in System.Linq.Enumerable.Range(0, 10)
                select new Disposable(d);
    //  alternatively:
    //  var q = System.Linq.Enumerable.Range(0, 10)
    //          .Select(d => new Disposable(d));

        foreach(var item in q)
        {
            Console.WriteLine("Hi");
        }
    }
    public static IEnumerable<R> Select<T, R>(
        this IEnumerable<T> list, Func<T, R> selector) where R : IDisposable
    {
        foreach (var item in list)
            using (var disposable = selector(item))
                yield return disposable;
    }