.NET Framework
ReadOnlyCollections
サーチ…
備考
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);
}