2009-11-19 47 views
4

.NET v2LinkedList的只讀封裝。如何?

當列表有一個非常有用的(4 me)方法AsReadOnly() LinkedList沒有這樣的方法。

有沒有辦法「快速」連接內部LinkedList只能從外部代碼讀取?

回答

4

ReadOnlyCollection<T>需要一個IList<T>作爲構造函數的參數。 LinkedList<T>沒有實現這個接口。 List<T>有一個構造函數過載,它將IEnumerable<T>作爲參數,LinkedList<T>實現此接口。所以下面應該工作:

LinkedList<int> linked = new LinkedList<int>(); 
// populate the list 

ReadOnlyCollection<int> readOnly = new ReadOnlyCollection<int>(
    new List<int>(linked)); 

它使用的List<T>實例攜帶物品進入ReadOnlyCollection<T>構造。

+0

工作。謝謝! – serhio 2009-11-19 11:42:18

+1

*抱怨只想要一個readonly'LinkedList'不是'IList' *(這個問題,而不是答案) – 2009-11-19 11:50:45

+0

可惜在這種情況下,我失去了第一個和最後一個鏈表的屬性... – serhio 2009-11-19 11:50:50

8

爲什麼不只是返回一個IEnumerable<T>?如果您只想讓用戶枚舉列表而不修改它*,IEnumerable是明顯的選擇。

如果您想擁有LinkedList接口的只讀接口,可以將LinkedList,只讀方法轉發到包裝列表並拒絕任何更改。

*)請記住,ReadOnlyCollection不是IEnumerable將阻止調用方在引用類型集合的情況下更改對象的狀態。如果對象只能被讀取,則需要將其作爲其類型的一部分來實現。

+0

你能解釋一下嗎? – serhio 2009-11-19 11:30:52

+0

我假設你想要返回你的LinkedList的只讀版本。您可以通過將其作爲IEnumerable 返回來完成此操作。這將允許調用者枚舉列表,但不能修改它。 – 2009-11-19 11:41:27

+0

如果我要保留列表屬性,如First,Last和Next ... – serhio 2009-11-19 12:07:51

0

LinkedList<T>沒有執行IList因此總之,沒有辦法快速做到這一點。如果您將LinkedList強制轉換爲列表,您可能會失去所需的功能。

LinkedList<T>不提供任何子類化,所以你需要寫你自己的。我想象下一個請求是「你能告訴我怎麼做」

+0

你能告訴我該怎麼做嗎? 謝謝。 – serhio 2009-11-19 11:32:56

+0

返回列表好嗎?或者你是否需要它是一個'LinkedList' – 2009-11-19 11:38:26

+0

我願意一個*鏈接*只讀列表 – serhio 2009-11-19 11:55:23