.NET 4.0中的只读列表或不可修改列表

时间:2009-06-11 22:13:21

标签: c# java .net readonly-collection

据我所知,.NET 4.0仍然缺少只读列表。为什么框架仍然缺乏此功能?这不是domain-driven design最常用的功能之一吗?

Java对C#的优点之一就是Collections.unmodifiablelist(list)方法的形式,似乎在IList< T>中已经过了很长时间。或列出< T>。

使用IEnumerable<T>是问题的最简单解决方案 - 可以使用ToList并返回副本。

7 个答案:

答案 0 :(得分:139)

您正在寻找自{.NET}以来一直存在的ReadOnlyCollection

IList<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = new ReadOnlyCollection<string>(foo);

List<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = foo.AsReadOnly();

这将创建一个只读的视图,它反映了对包装集合所做的更改。

答案 1 :(得分:13)

框架内已有ReadOnlyCollection怎么样?

答案 2 :(得分:11)

如果列表中最常见的模式是遍历所有元素,IEnumerable<T>IQueryable<T>也可以有效地充当只读列表。

答案 3 :(得分:11)

对于那些喜欢使用界面的人: .NET 4.5添加了通用IReadOnlyList接口,该接口由List<T>实现。

它与IReadOnlyCollection类似,并添加了Item索引器属性。

答案 4 :(得分:7)

在2.0中,您可以调用AsReadOnly来获取列表的只读版本。或者将现有IList包装在ReadOnlyCollection<T>对象中。

答案 5 :(得分:7)

答案 6 :(得分:0)

在IEnumerable上创建一个扩展方法ToReadOnlyList(),然后

IEnumerable<int> ints = new int[] { 1, 2, 3 };
var intsReadOnly = ints.ToReadOnlyList();
//intsReadOnly [2]= 9; //compile error, readonly

这里是扩展方法

public static class Utility
{
    public static IReadOnlyList<T> ToReadOnlyList<T>(this IEnumerable<T> items)
    {
        IReadOnlyList<T> rol = items.ToList();
        return rol;
    }
}

也见Martin's answer