2013-02-01 43 views
0

我正在尋找一個只讀的泛型集合庫,它是一個鏡像(或者說是實現或擴展)與.NET v3.5兼容的常見System.Collections.Generic;集合的.NET版本。是否有一組C#數據只讀泛型集合/數據結構?

我猜F#可能只有一個只讀集合(但我不確定它們是否實現了System.Collections.Generic的接口)。除此之外,我寧願不在服務器上安裝F#。我想我可能會簡單地部署F#dll(s),如果這是可行的,我懷疑它。

是否有一個只讀泛型集合類的庫,它們實現了System.Collections.Generic中的接口並提供相同的性能(或更好)特性?例如,隨機訪問數組支持IList的實現(只讀)。

+0

4.5中添加了該名稱空間中大多數集合的只讀接口。該集合不會是不可變的,但您可以爲其他人提供只讀視圖。如果通過這樣的視圖暴露了這個集合,那麼它是有效的不可變的;爲所有意圖和目的。 – Servy

+0

您可以像其他任何部署F#程序集一樣 - 因此,如果要從C#應用程序的'FSharp.Core'中使用不可變集合類型,只需添加對其的引用並將其標記爲'Copy Local'。 –

+0

現有System.Collections.Generic接口中定義的大多數方法對於不可變集合都是無用的。例如,從IList 接口中,不能實現set_Item,Add,Clear,Insert,Remove或RemoveAt。在不可變集合上實現這些接口在某些情況下可能會很方便,但在大多數情況下會要求拋出異常。出於這個原因,F#集合實現的唯一System.Collections.Generic接口是'IEnumerable ' – phoog

回答

3

ReadOnlyCollection<T>System.Collections.ObjectModel

這是你想要的任何集合的包裝。 最常見的是使用List<T>並用ReadOnlyCollection<T>包裝它。

然後,在公開實施中,您只允許訪問ReadOnlyCollection<T>並將List<T>設置爲私有。

public class MyClass 
{ 
    private List<MyItemClass> list; 
    public ReadOnlyCollection<MyItemClass> MyReadOnlyCollection { get; private set; } 

    public MyClass() 
    { 
     list = new List<MyItemClass>() { ... }; 
     MyReadOnlyCollection = new ReadOnlyCollection<MyItemClass>(list); 
    } 
} 

如果你想要一個 「不可變對象」:

public class MyClass 
{ 
    public ReadOnlyCollection<MyItemClass> MyReadOnlyCollection { get; private set; } 

    public MyClass() 
    { 
     List<MyItemClass> list = new List<MyItemClass>() { ... }; 
     MyReadOnlyCollection = new ReadOnlyCollection<MyItemClass>(list); 
    } 
} 

這樣,MyReadOnlyCollectionlist狀態也不會改變。

+0

我見過那個集合 - 我對ISet,IDictionary,IList等感興趣。我希望有一個單一的每個這些結構的源代替來自ObjectModel的ICollection,以及來自其他地方的IList/ISet。它也似乎ReadOnlyCollection 只是一個包裝。如果修改了原始引用,則修改ReadOnlyCollection。我想,我原來的意圖是關閉的 - 只讀,我的意思是不變的。 – lucidquiet

+0

@lucidquiet是的,但您可以刪除對基礎集合的可見引用。之後,您將無法訪問它。 –

+1

@lucidquiet:你在詢問有衝突的事情。 'ISet','IDictionary'和'IList'是可變接口,所以你不會找到實現這些的不可變集合,除非它們爲可變操作拋出異常。實際上,這就是F#的['dict'](http://msdn.microsoft.com/zh-cn/library/ee353774.aspx)運算符所要做的。 – Daniel

0

你應該看看System.Collection.ObjectModel。

你有一個只讀字典,列表和可觀察列表。

他們可以和任何可枚舉的東西玩。

6

如果你想不可改變,不只是只讀的,你可能感興趣的收藏品Microsoft's preview of immutable collections

對於System.Collections.Generic中的大多數類別都有對應的。

+0

看起來很有希望,但只出現在.NET 4.5中 – lucidquiet

+1

+1令人興奮,'一直在等待這些年! –

0

根據您的要求,這可能足以暴露集合作爲IEnumerable<T>,這是隻讀性質:

var list = new List<int> {1,2,3,4}; 
var coll = list.AsEnumerable(); //read-only interface 

但是,主叫方仍然可以投收集到的具體類型,使它可變:

var backToList = (List<int>)coll; //now it's mutable again 

您還可以使用ReadOnlyCollection<T>,不具有上述問題的選項:

var readonlyCollection = list.AsReadOnly(); // returns a ReadOnlyCollection<int>