2009-06-11 99 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也可以有效地充當只讀列表。