【问题标题】:How to concatenate ReadOnlyCollection如何连接 ReadOnlyCollection
【发布时间】:2014-01-02 20:00:16
【问题描述】:

ReadOnlyCollection 构造函数要求您为其提供 IList。 但是,如果您有一些 ROC 想要连接并生成一个新的 ROC,Concat 方法将返回 IEnumerable。这不是传递给 ROC 构造函数的有效参数。

那么如何创建一个 ROC 作为其他 ROC 的串联?

到目前为止,这是我能想到的最好的:

ReadOnlyCollection<T> ROCConcat<T> ( ReadOnlyCollection<T> a, ReadOnlyCollection<T> b)
{
    List<T> tmp = new List<T>();
    foreach (T f in a.Concat(b))
        tmp.Add(f);
    return new ReadOnlyCollection<T>(tmp);
}

【问题讨论】:

  • 请注意,当您这样做时,您会破坏 ROC 与其底层 IList 之间的链接,因此如果修改了 IList(在列表中添加或删除了一个项目,我不是在说关于正在修改的列表中的项目)ab 将显示修改,但您的新连接集合仍将显示原始 IList 连接在一起。

标签: c# concat readonly-collection


【解决方案1】:

从您的IEnumerable&lt;&gt; 中创建一个新的List&lt;&gt;

return new ReadOnlyCollection<T>(a.Concat(b).ToList());

或者我更喜欢:

return a.Concat(b).ToList().AsReadOnly();

这些基本上和你想出的一样,但它们更容易看。

【讨论】:

  • 啊。所以我重新发明了 ToList 和 AsReadOnly 方法。但从概念上讲,这仍然是一样的。我想创建中间列表并不是重大的性能问题,所以这已经足够好了。但是,如果有办法在不创建中间列表的情况下做到这一点,我可能会接受其他答案。
  • @EdwardNedHarvey:没错。关键是要意识到ReadOnlyCollection 只是一个现有列表的包装器。这就是为什么它是AsReadOnly() 而不是ToReadOnly()。所以 List 本身不是 intermediate 步骤——它是 ReadOnlyCollection 所基于的结构。 .Concat() 便宜,.ToList() 贵,.AsReadOnly() 便宜。
【解决方案2】:

我相信您可以使用ReadOnlyCollectionBuilder 来执行此操作。

return (new ReadOnlyCollectionBuilder<T>(a.Concat(b))).ToReadOnlyCollection();

【讨论】:

  • 我什至不知道这个课程存在,荣誉!
  • 专门为此目的创建的类。太棒了,谢谢你。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多