0

System.Collections.Generic;.NET v3.5 と互換性 のある共通コレクションの .NET バージョンのミラー (または実装または拡張) である読み取り専用のジェネリック コレクションのライブラリを探しています。

F# にはおそらく多数の読み取り専用コレクションがあると思います (ただし、System.Collections.Generic からのインターフェイスを実装しているかどうかはわかりません)。それ以上は、サーバーに F# をインストールしたくありません。可能であれば、F# dll(s) を単純に展開できると思います。

System.Collections.Generic のインターフェイスを実装し、同じ (またはそれ以上の) パフォーマンス特性を提供する、読み取り専用のジェネリック コレクション クラスのライブラリはありますか? たとえば、ランダム アクセス アレイは、IList (読み取り専用のみ) の実装をサポートしています。

4

4 に答える 4

6

読み取り専用だけでなく不変のコレクションが必要な場合は、 Microsoft の不変コレクションのプレビューに興味があるかもしれません。

のほとんどのクラスに相当するものがありますSystem.Collections.Generic

于 2013-02-01T16:18:16.163 に答える
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);
    }
}

このように、 と の状態はMyReadOnlyCollection変更listされません。

于 2013-02-01T16:16:30.933 に答える
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>
于 2013-02-01T16:26:38.860 に答える
0

System.Collection.ObjectModel を見てください。

そこには、読み取り専用のディクショナリ、リスト、および観察可能なリストがあります。

彼らは列挙可能なものなら何でもうまく機能します。

于 2013-02-01T16:17:30.760 に答える