サーチ…


備考

ReadOnlyCollectionは、既存のコレクション( 'ソースコレクション')に対して読み取り専用ビューを提供します。

アイテムは、 ReadOnlyCollection直接追加または削除されません。代わりに、それらは追加されてソースコレクションから削除され、 ReadOnlyCollectionはこれらの変更をソースに反映します。

ReadOnlyCollection内の要素の数と順序は変更できませんが、範囲内にあると仮定して、要素のプロパティを変更してメソッドを呼び出すことができます。

外部コードでコレクションを変更せずに表示できるようにするにはReadOnlyCollection使用しますが、コレクションは自分で変更することができます。

関連項目

  • ObservableCollection<T>
  • ReadOnlyObservableCollection<T>

ReadOnlyCollections対ImmutableCollection

ReadOnlyCollectionは、あなたが作成したImmutableCollection編集できないという点で、 ImmutableCollectionと異なりますImmutableCollectionは、常にn要素を含み、置き換えたり並べ替えたりすることはできません。一方、 ReadOnlyCollectionは直接編集することはできませんが、ソースコレクションを使用して要素を追加/削除/並べ替えすることはできます。

ReadOnlyCollectionの作成

コンストラクタの使用

ReadOnlyCollectionは、既存のIListオブジェクトをコンストラクタに渡すことによって作成されIList

var groceryList = new List<string> { "Apple", "Banana" };
var readOnlyGroceryList = new ReadOnlyCollection<string>(groceryList);

LINQの使用

さらに、LINQはIListオブジェクトのAsReadOnly()拡張メソッドを提供します。

var readOnlyVersion = groceryList.AsReadOnly();

注意

通常、ソースコレクションを非公開にして、 ReadOnlyCollectionへのパブリックアクセスを許可します。インラインリストからReadOnlyCollectionを作成することはできますが、コレクションを作成した後でコレクションを変更することはできません。

var readOnlyGroceryList = new List<string> {"Apple", "Banana"}.AsReadOnly();
// Great, but you will not be able to update the grocery list because 
//  you do not have a reference to the source list anymore!

これを行うことがわかった場合は、 ImmutableCollectionなどの別のデータ構造の使用を検討することをお勧めします。

ReadOnlyCollectionの更新

ReadOnlyCollectionは直接編集できません。代わりに、ソースコレクションが更新され、 ReadOnlyCollectionにこれらの変更が反映されます。これは、 ReadOnlyCollection重要な機能です。

var groceryList = new List<string> { "Apple", "Banana" };

var readOnlyGroceryList = new ReadOnlyCollection<string>(groceryList);

var itemCount = readOnlyGroceryList.Count;  // There are currently 2 items

//readOnlyGroceryList.Add("Candy");         // Compiler Error - Items cannot be added to a ReadOnlyCollection object
groceryList.Add("Vitamins");                // ..but they can be added to the original collection

itemCount = readOnlyGroceryList.Count;      // Now there are 3 items
var lastItem = readOnlyGroceryList.Last();  // The last item on the read only list is now "Vitamins"

デモを見る

警告:ReadOnlyCollection内の要素は、本質的には読み取り専用ではありません

ソースコレクションのタイプが不変でない場合、 ReadOnlyCollectionアクセスされるエレメントは変更できます。

public class Item
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

public static void FillOrder()
{
    // An order is generated
    var order = new List<Item>
    {
        new Item { Name = "Apple", Price = 0.50m },
        new Item { Name = "Banana", Price = 0.75m },
        new Item { Name = "Vitamins", Price = 5.50m }
    };

    // The current sub total is $6.75
    var subTotal = order.Sum(item => item.Price);

    // Let the customer preview their order
    var customerPreview = new ReadOnlyCollection<Item>(order);

    // The customer can't add or remove items, but they can change 
    //   the price of an item, even though it is a ReadOnlyCollection
    customerPreview.Last().Price = 0.25m;

    // The sub total is now only $1.50!
    subTotal = order.Sum(item => item.Price);
}

デモを見る



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow