在 Linq 中处置 IDisposable

2024-01-24

(这是对答案的评论的后续this https://stackoverflow.com/questions/1751153/how-do-you-dispose-of-idisposableobject-create-inside-of-a-linq-expression问题)

在我发布 18 个月后,有人发现了一个错误我的 Linq 示例之一 https://stackoverflow.com/questions/21280/am-i-missing-something-about-linq/80709#80709,我在方法链的中间使用了 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);

看到后马克的回答 https://stackoverflow.com/questions/1751153/how-do-you-dispose-of-idisposableobject-create-inside-of-a-linq-expression/1751277#1751277对于我上面提到的问题,我想知道是否可以直接重载 Select 扩展方法,但如果我这样做(通过重命名Using to Select),编译器会发出尖叫声Select(d => d.Id), 因为There is no implicit conversion from 'string' to 'System.IDisposable'.

这是一个测试课...

public class Disposable : IDisposable
{
    private string _id;
    private bool _disposed = false;
    public Disposable(int id)
    {
        Id = id.ToString();
        Console.WriteLine("Creating " + Id);
    }
    public void Dispose()
    {
        Console.WriteLine("Disposing " + Id);
        _disposed = true;
    }
    public string Id 
    { 
        get 
        {
            if(_disposed) throw new Exception("Call to disposed object!");
            return _id; 
        }
        set { _id = value; }
    }
}

像这样吗?除了构造函数的用法之外,我在这里并没有真正改变太多......

    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;
    }

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Linq 中处置 IDisposable 的相关文章

  • 优化 LINQ 查询 - 如何缩短执行时间?

    我想知道是否有一个好的方法来优化我的 LINQ 查询 我正在使用类似于以下内容的 LINQ 查询从数据库检索数据 PKs is a list of integers var import context table Where x gt P
  • 将 IDisposable 传递给父 IDisposable 时会产生什么行为

    昨天 在我们的代码库上运行 Visual Studio 代码分析后 以下代码被突出显示为一个问题 using var stringReader new StringReader someString using var reader Xml
  • & 运算符的含义是什么?

    在下面的代码中 Expression
  • 实体框架 - 从 ObjectContext 查询与从导航属性查询

    我注意到 根据从实体框架模型中提取数据的方式 我会得到不同类型的结果 例如 获取特定部门的员工列表时 如果我直接从 ObjectContext 中提取 我会得到一个IQueryable
  • Linq 连接两个值

    假设我有一个列表 City State 它最初来自数据库 我有LocationID 但现在我将它加载到内存中 假设我还有一张快餐店表 其中记录了城市和州 我需要获取与城市和州相匹配的机构列表 注意 我尝试描述一个简化的场景 我的业务领域完全
  • “ToListAsync()”和“AsAsyncEnumerable().ToList()”之间的区别

    函数需要返回Task
  • Linq 的 let 语句将引用设置为 null

    某个天体星座包含SortedList将对这些列表的引用设置为null当使用一个let在 Linq 查询中 这是一个最小的工作示例 其中大部分只是一些设置 以确保它反映我正在工作的环境 重要的部分是在最后一行 它会抛出一个NullRefere
  • 嵌套 linq 查询上的“列名 [ColumnName] 无效”

    最后更新 经过大量测试后 我意识到 如果我对 SQL 2000 和 SQL 2005 上的同一数据集 在本例中为 Northwind 表运行相同的查询 我会得到两个不同的结果 在 SQL 2000 上 我收到问题中的错误 在 SQL 200
  • 是否可以在 C# 中实现 mixin?

    我听说可以使用扩展方法 但我自己不太明白 如果可能的话我想看一个具体的例子 Thanks 这实际上取决于 mixin 的含义 每个人似乎都有稍微不同的想法 我想要的那种 mixinlike看看 但在 C 中不可用 使通过组合实现变得简单 p
  • 根据另一个列表的内容对列表进行排序

    我有一个包含整数列表的列表和另一个包含同时包含整数和字符串的类的列表 我想做的是按字母顺序对列表进行排序 将第一个列表中存在的条目放在前面 这是我的代码和预期输出 using System using System Collections
  • Angular 7 向原语添加扩展方法

    我想向原语添加一些方法 我有以下文件 字符串扩展 ts interface String isNullOrEmpty this string boolean String prototype isNullOrEmpty function t
  • 如何为连接范围变量编写动态 where 子句

    我一直在使用 LINQ 进行查询 但遇到了动态 where 子句的问题 我想检查一个条件 如果为真 则将其添加到我的查询中 问题在于 where 正在使用我的连接之一中的范围变量之一 我的工作查询如下 var query from proj
  • 如何使用“Linq to Objects”将一组连续的日期放入一个组中?

    我有一个麻烦的查询要写 我目前正在编写一些令人讨厌的 for 循环来解决这个问题 但我很想知道 Linq 是否可以为我做到这一点 I have struct TheStruct public DateTime date get set ti
  • 打印出 Linq 表达式树层次结构

    The 动态语言运行时 DLR http msdn microsoft com en us library dd233052 aspx有一些非常酷的表达式代码 包括一些非常好的代码来打印我想使用的表达式树 以便 int a 1 int b
  • LINQ GroupBy 匿名类型

    我想知道为什么 GroupBy 与匿名类型一起使用 List
  • 在 Linq 中分组同时保留顺序

    我有一个IQueryable Of Job 除其他事项外 约伯还拥有 Property CreatedOn as DateTime Property JobType as JobTypes Enum JobTypes JobType1 Jo
  • 正确使用 IDisposable 接口

    我从阅读中知道微软文档 https learn microsoft com dotnet api system idisposable的 主要 用途IDisposable接口是为了清理非托管资源 对我来说 非托管 意味着数据库连接 套接字
  • C#/Linq 获取相邻的集合

    我有一个有序列表 例如 0 1 2 6 7 10 我想要得到数字加 1 的集合 我想要第一个数字和计数或系列 所以我会得到开始 0 计数 3开始 6 计数 2开始 10 计数 1 我怎样才能在 C 中做到这一点 答案是我认为最好的方式 对我
  • 在实体框架中对连接字符串进行硬编码

    我知道很多人认为对连接信息进行硬编码是一个坏主意 但我有一个特定的情况需要这样做 请不要贬低我 因为你认为这是一个坏主意 再次 非常具体的情况 使用下面的代码 我在 LINQ 语句上收到以下错误 底层提供程序在打开时失败 我已经独立测试了连
  • 将 CSV 文件读取到嵌套对象

    我有 CSV 文件 例如 Title Column Value A Z1 1 A Z1 2 A Z1 3 A Z2 1 A Z2 5 B Z3 4 B Z3 6 我想将此 csv 文件读入以下类层次结构 我想最终得到一个列表MyClass

随机推荐

  • 在 Visual Studio 2010 中调试 exe

    有没有办法使用 Visual Studio 2010 通过 Shift 双击运行 exe 来调试外部 exe 通常 要在特殊模式下运行应用程序 我们必须按 Shift 键并双击 exe 但我在启动时遇到了一个错误 我想我需要添加一个命令行参
  • 如何替换cmd.exe中的百分号字符?

    在 Windows 命令提示符中 我尝试替换中的空格set string Hello World用字符串 20 天真地尝试像这样使用字符串文字 20 set string string 20 结果是HelloWorld20 尝试使用转义字符
  • Java Swing 菜单速度缓慢的解决方法

    在 Java 7 和 8 中 Swing 菜单中存在一个错误 导致在其他 X11 应用程序正在运行时通过 X11 远程运行应用程序时速度缓慢 这个问题是在 Java 7 中引入的 并且从未得到修复 有人对解决方法有任何建议吗 使用 nxcl
  • 在python3 asyncio中使用串口

    我正在尝试 但到目前为止 未能使用 python asyncio 访问串行端口 我真的很感激关于在简单的 fd 上使用新的 python 异步框架的任何提示 Cheers James 这是一个使用的工作示例pyserial异步 https
  • C# 中 CreateObject 的等效代码

    我有一个VB6代码 谁能告诉我怎么写C 这段代码如下 Set Amibroker CreateObject Broker Application Set STOCK Amibroker Stocks Add ticker Set quote
  • 循环提示输入另一个密码时出现问题

    我需要一些关于 EXPECT 脚本的帮助 我正在尝试在访问大量主机之前自动登录 并在用户错误输入密码时进行处理 我首先获取用户名和密码 然后针对特定主机对其进行验证 如果密码无效 我想循环并再次询问用户名和密码 我正在尝试这个 省略前面几行
  • 当我运行代码时,我得到一个奇怪的输出(在问题中列出)。我该怎么办? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 from turtle import Turtle Screen timmy the turtle Turtle timmy the tur
  • 合并两个具有不同列数的表

    我有两张表 表 A 和表 B 它们具有不同数量的列 假设表 A 有更多列 如何合并这两个表并为表 B 没有的列获取 null 对于具有较少列的表 将额外的列添加为空 例如 Select Col1 Col2 Col3 Col4 Col5 fr
  • Hilt ViewModel 没有零参数构造函数

    Cannot create an instance of class com comp app winners WinnersViewModel Caused by java lang InstantiationException java
  • 如何收到从 SD 卡删除任何文件的通知

    我想创建Dumpster https play google com store apps details id com baloota dumpster像应用程序一样 为此我希望在用户删除任何文件时收到通知 以便我可以将其保存到我的应用程
  • 如何使用多个数组创建 JSON 对象?

    我以前从未使用过 JSON 所以我不熟悉它的语法 目前我有多个包含不同数据的数组 我想创建一个 JSON 对象 其中包含多个数组 每个数组都有几条数据 E g 一个名为 cars 的对象 包含多个数组 每个数组对应不同品牌的汽车 每个数组中
  • ASP.NET Core MVC 应用程序中的 Microsoft LocalReport (rdl)

    我正在使用 ASP NET Core 2 1 MVC 运行一个项目 在我们公司 我们确实使用 SQL Report Builder rdlc 和 rdl 文件 完成了大量工作 因此 我们希望在 ASP NET Core MVC Web 应用
  • 如果弹出窗口

    有没有办法判断当前窗口是否是弹出窗口 这就是我现在所拥有的 但由于某种原因它不起作用 我试图确保某些页面仅显示在弹出窗口中 if opener window location error php 即使窗口没有弹出 opener 的值也是 o
  • ColdFusion 在字符串中构造数据库查询时添加额外的引号

    我正在 ColdFusion 中编码 但试图留在 cfscript 中 所以我有一个函数允许我传入一个查询来运行它
  • 如何将 Tensor 转换为 ndarray(里面有对抗性图像的张量)

    注意 我已经尝试过不同 SO 问题的解决方案 但没有成功 详细信息如下 我正在学习克莱尔汉斯Python 教程 重点关注this https github com tensorflow cleverhans blob master clev
  • AWS Lambda 上的 Python:来自 botocore.vendored 的“请求”已弃用,但“请求”不可用

    我有一个用于 AWS Lambda 函数的 Python 脚本 该函数向另一个端点发出 HTTP POST 请求 自从Python的urllib2 request https docs python org 2 library urllib
  • 生成唯一的随机字母数字字符串

    我正在开发一个应用程序 允许用户共享简单调查的链接 为此 我想为每个调查生成唯一的 URL 因此具有如下 URL http myapp com aBcDe1F 我希望 URL 的字母数字标识符部分是伪随机的并且有点短 6 8 个字符 现在
  • Highcharts 异步钻取

    我正在关注http jsfiddle net gh get jquery 1 7 2 highslide software highcharts com tree master samples highcharts drilldown as
  • lambda 表达式的扩展方法

    我有一个辅助方法 它获取由 lambda 定义的属性的名称 其工作原理如下 ExpressionUtil GetName Thing t gt t Property returns Property 我想将其转换为扩展方法 因此语法将采用以
  • 在 Linq 中处置 IDisposable

    这是对答案的评论的后续this https stackoverflow com questions 1751153 how do you dispose of idisposableobject create inside of a lin