私が知る限り、.NET 4.0 にはまだ読み取り専用リストがありません。フレームワークにまだこの機能がないのはなぜですか? これは、ドメイン駆動設計の最も一般的な機能の 1 つではありませんか?
Java が C# より優れている数少ない利点の 1 つは、これがCollections.unmodifiablelist(list)メソッドの形式であることです。
IEnumerable<T>
質問に対する最も簡単な解決策は、使用ToList
することです。使用してコピーを返すことができます。
私が知る限り、.NET 4.0 にはまだ読み取り専用リストがありません。フレームワークにまだこの機能がないのはなぜですか? これは、ドメイン駆動設計の最も一般的な機能の 1 つではありませんか?
Java が C# より優れている数少ない利点の 1 つは、これがCollections.unmodifiablelist(list)メソッドの形式であることです。
IEnumerable<T>
質問に対する最も簡単な解決策は、使用ToList
することです。使用してコピーを返すことができます。
あなたが探しReadOnlyCollection
ているのは、.NET2 から存在している です。
IList<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = new ReadOnlyCollection<string>(foo);
また
List<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = foo.AsReadOnly();
これにより、ラップされたコレクションに加えられた変更を反映する読み取り専用ビューが作成されます。
既にフレームワーク内にあるReadOnlyCollectionはどうですか?
リストの最も一般的なパターンがすべての要素を反復処理する場合、IEnumerable<T>
またはIQueryable<T>
読み取り専用リストとして効果的に機能する場合。
2.0 では、 を呼び出しAsReadOnly
てリストの読み取り専用バージョンを取得できます。または、既存IList
のReadOnlyCollection<T>
オブジェクトをラップします。
System.Collections.ObjectModel.ReadOnlyCollectionの何が問題になっていますか?
IEnumerable に拡張メソッド ToReadOnlyList() を作成し、次に
IEnumerable<int> ints = new int[] { 1, 2, 3 };
var intsReadOnly = ints.ToReadOnlyList();
//intsReadOnly [2]= 9; //compile error, readonly
拡張方法はこちら
public static class Utility
{
public static IReadOnlyList<T> ToReadOnlyList<T>(this IEnumerable<T> items)
{
IReadOnlyList<T> rol = items.ToList();
return rol;
}
}
マーティンの答えも見てください