C# 如何连接ReadOnlyCollection

C# 如何连接ReadOnlyCollection,c#,concat,readonly-collection,C#,Concat,Readonly Collection,ReadOnlyCollection构造函数要求您为其指定IList。 但是如果您有一些ROC想要连接并生成一个新的ROC,Concat方法将返回IEnumerable。这不是传递给ROC构造函数的有效参数 那么,如何创建一个ROC作为其他ROC的串联呢 到目前为止,这是我能想到的最好办法: ReadOnlyCollection<T> ROCConcat<T> ( ReadOnlyCollection<T> a, ReadOnlyCollection<T

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);
}
ReadOnlyCollection roconcat(ReadOnlyCollection a、ReadOnlyCollection b)
{
List tmp=新列表();
foreach(a.Concat(b)中的tf)
tmp.Add(f);
返回新的只读集合(tmp);
}
从您的
IEnumerable
中创建一个新的
列表:

这些基本上和你想出来的一样,但是它们对眼睛更容易一些。

我相信你可以用它们来做这件事

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

请注意,当您这样做时,您会断开ROC与其基础
IList
之间的链接,因此如果修改
IList
(列表中添加或删除了一个项目,我不是说列表中正在修改的项目)
a
b
将显示修改,但新的concated集合仍将显示原始的
IList
的concated在一起。啊。所以我重新发明了ToList和AsReadOnly方法。但在概念上,这仍然是一样的。我想创建中间列表并没有明显的性能问题,所以这就足够了。但如果有一种方法可以在不创建中间列表的情况下做到这一点,我可能会接受另一种答案。@EdwardNedHarvey:没错。关键是要认识到,
ReadOnlyCollection
只是现有列表的包装器。这就是为什么它是
AsReadOnly()
而不是
ToReadOnly()
。因此,列表本身不是中间步骤,
ReadOnlyCollection
所基于的结构
.Concat()
很便宜,
.ToList()
很贵,
.AsReadOnly()
很便宜。我甚至不知道这个类的存在,谢谢!专门为此目的创建的类。太棒了,谢谢你。:-)
return a.Concat(b).ToList().AsReadOnly();
return (new ReadOnlyCollectionBuilder<T>(a.Concat(b))).ToReadOnlyCollection();