2009-06-11 94 views
74

从我所知道的来看,.NET 4.0仍然缺少只读列表。为什么框架仍然缺乏这种功能?这不是domain-driven design最常见的功能之一吗?.NET 4.0中的只读列表或不可修改列表

Java对C#有几个优势之一就是Collections.unmodifiablelist(list)方法的形式,它似乎早就在IList < T>或List < T>中。

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

+0

似乎有一个真正的只读`列表`唯一真正的方法是写你自己的,没有内置的类,我知道,支持所有的“只读”功能列表`像Contains一样,LINQ查询等。 – jrh 2017-08-17 12:37:31

回答

110

您正在寻找自.NET2以来一直存在的ReadOnlyCollection

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

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

这就产生了一个只读视图,这反映给被包装的集合所做的更改。

+0

我现在问这个问题有点愚蠢 - 不知道ReadOnlyCollection – 2009-06-12 08:56:03

+36

不是 - 我也没有,当我去找同样的东西,发现你的问题 – 2011-02-21 11:33:32

7

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

+0

这就是Collections.unmodifiablelist(list)的等价物 – 2009-06-12 10:49:08

+0

我错过了.NET 4,因为我使用的是IList 而不是真正的List 。请务必注意,只要您处理List ,AsReadOnly仍然可以在.NET 4中使用。 – BlueMonkMN 2012-09-28 14:47:40

13

ReadOnlyCollection如何在框架内?

9

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