据我所知,.NET 4.0仍然缺少只读列表。为什么框架仍然缺乏此功能?这不是domain-driven design最常用的功能之一吗?
Java对C#的优点之一就是Collections.unmodifiablelist(list)方法的形式,似乎在IList< T>中已经过了很长时间。或列出< T>。
使用IEnumerable<T>
是问题的最简单解决方案 - 可以使用ToList
并返回副本。
答案 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;
}
}