防止C#中的列表更改

时间:2012-09-06 16:57:09

标签: c# .net linked-list readonly

我在程序集A(DLL)中有一个对象的链接列表(可以更改为任何其他Collection类型,只要它保持条目顺序)。

当程序集B从包含所述LinkedList的类创建一个对象时,它会分配一个方法来报告一些信息。该方法采用的一个参数是LinkedList。

现在我希望程序集B中的这个方法能够从该LinkedList中读取(遍历它并根据它的内容进行处理),但是我需要阻止该方法更改List中的数据。

虽然我现在正在使用程序集A,但是当它公开时,我需要阻止数据从我的程序集外部更改,这样使用该库的第三方就不会对程序集中的结果产生影响。

基本上我希望'密封'将组件A中的LinkedList带到程序集B的参数

我有意义吗?

5 个答案:

答案 0 :(得分:5)

new List<T>(linkedList).AsReadOnly();

答案 1 :(得分:3)

如果您可以从LinkedList<T>更改为List<T>,则可以使用AsReadOnly()方法生成列表的只读包装。包装器是轻量级的,不需要复制,并立即反映对底层集合的更改:

List<MyClass> originalList = ...
IList<MyClass> readOnly = originalList.AsReadOnly();

答案 2 :(得分:2)

不是将真实的链接列表传递给B的回调方法,而是传递副本。这样,B可以对列表执行任何操作,而无法修改原始列表。

使用LinkedList(IEnumerable) constructor

可以轻松创建链表的副本
var copy = new LinkedList<MyType>(originalList);

显然,B的元素可以被B修改,如果它们是可变的,但我相信你已经知道了。

答案 3 :(得分:2)

我认为返回IEnumerable<T>代替List<T>可以解决您的问题。最简单的方法:

foreach( var t in list )
    yield t;

这样您只会返回枚举器。消费者将无法更改列表的内容。

答案 4 :(得分:0)

你能发布一些代码吗?

听起来你想让他们使用数据副本。这样,如果他们以某种方式改变它,原始副本将保持不变。

查看ICloneable接口以复制对象并创建一个全新的链接列表,其中包含所有原始内容的副本,并将其传递回程序集B.