我可以拥有一个不可变的IEnumerable<&gt ;?

时间:2009-03-13 00:34:40

标签: c# .net

我的代码类似于:

class Foo
{
   List<Bar> _myList;
   ...
   public IEnumerable<Bar> GetList() { return _myList; }
}

GetList()的结果 NOT 应该是可变的。

为了澄清,如果Bar的实例被修改,则可以 我只是想确保集合本身没有被修改。

我确定我在某处找到了答案,有人指出这是可能的,但对于我的生活,我再也找不到了。

5 个答案:

答案 0 :(得分:7)

已经提供的答案绝对可以正常使用,但我想我会补充一点,您可以在.NET 3.5中使用 AsReadOnly 扩展方法,如下所示:

class Foo
{
   List<Bar> _myList;
   ...
   public ReadOnlyCollection<Bar> GetList() { return _myList.AsReadOnly(); }
}

答案 1 :(得分:3)

您可以使用System.Collections.ObjectModel.ReadOnlyCollection

public ReadOnlyCollection<Bar> GetList() {return new ReadOnlyCollection<Bar>(_myList);}

答案 2 :(得分:1)

return new System.Collections.ObjectModel.ReadOnlyCollection<Bar>(_myList);

http://msdn.microsoft.com/en-us/library/system.collections.objectmodel.aspx

答案 3 :(得分:1)

您无法阻止在集合级别修改Bar元素。如果你只想要它不会有关于添加/删除/等的可变使用ReadOnlyCollection。

如果您需要强制执行每个元素都不可变,那么您必须在Bar类中强制执行该操作,即不要使用setter或任何更改Bar状态的方法。

答案 4 :(得分:0)

你可以从ReadOnlyCollecton公开IEnumerable,或者你可以这样做(假设是LINQ):

public IEnumerable<Bar> GetList() { return (from item in _myList select item); }