【问题标题】:how to lump up a IEnumerable<IDisposable>如何汇总 IEnumerable<IDisposable>
【发布时间】:2009-04-24 22:15:42
【问题描述】:

我有一个IEnumerable&lt;IDisposable&gt; 集合,我需要在给定点处理它。问题在于,在某些情况下,所有对象都属于一种类型,并且需要通过从对象中收集一些数据并进行一次 RPC 调用来处理对象。在其他情况下,对象将是另一种类型,我只需要对它们中的每一个调用 Dispose。

我控制执行此操作的代码,但我不想将实现细节推入其中。

如果需要,我可以切换到类似的东西,但它似乎不优雅。

with(var rpc = new RPCDisposer())
{
    foreach (var item in Items)
    {
        rpc.Add(item);
        item.Dispose();
    }
}

编辑:列表(目前)将只包含一种类型或另一种类型,绝不会同时包含两者。但我宁愿 Dispose 代码根本不必知道 RPC 的东西,例如:

foreach (var item in Items)
    item.Dispose();

【问题讨论】:

  • 您发布的内容确实不是那么糟糕的解决方案。老实说,我认为您正在寻找不存在的东西。使用您的初始解决方案并可能使用 LINQ 来简化它,但仅此而已。
  • 我有一半的预期,但只是希望有更好的东西。

标签: .net idisposable rpc


【解决方案1】:

如果这取决于项目类型,那么您可以检查您获得的项目类型,仅将那些特定类型的项目添加到 RPCDisposer。

using(var rpc = new RPCDisposer())
{
    foreach (var item in Items)
    {
        if (item is RPCItemType)
            rpc.Add(item);
        item.Dispose();
    }
}

但如果你不在同一个列表中混合这些对象会更好。您能否重构您的代码以将它们保存在两个不同的列表中?

【讨论】:

  • OTOH 在某些时候我会得到一个混合包(并且需要运行多个 RPC,每个远程系统一个)所以我可能需要硬着头皮假设代码需要对项目进行排序.
【解决方案2】:

OfType 方法可能会帮助您将项目分成两个列表...

var rpcItems = items.OfType<RPCItemType>();    
var normalItems = items.Where(x => !rpcItems.Contains(x));

【讨论】:

    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多