問題タブ [readonly-collection]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - メンバーコレクションを公開するための ReadOnlyCollection または IEnumerable?
呼び出し元のコードがコレクションを反復処理するだけの場合、内部コレクションを IEnumerable ではなく ReadOnlyCollection として公開する理由はありますか?
ご覧のとおり、IEnumerable は ReadOnlyCollection のインターフェイスのサブセットであり、ユーザーがコレクションを変更することはできません。したがって、IEnumberable インターフェイスで十分な場合は、それを使用します。それはそれについて推論する適切な方法ですか、それとも何かが欠けていますか?
ありがとう/エリック
c# - ReadOnlyCollectionのobject[]
リフレクションコールを介して最終的に作成されたオブジェクトがあります。
object readOnlyCollectionObject = propertyInfo.GetValue(someEntity, null);
私はこのオブジェクトが一般的なReadOnlycollectionであることを知っています。ReadOnlyCollection<Cat>
、などの可能性がありReadOnlyCollection<Dog>
ます。議論のために、それがであるとだけ言いましょうReadOnlyCollection<T>
。
Dogはオブジェクトから派生していますが、aReadOnlyCollection<Dog>
はから派生していないことを私は知っていReadOnlyCollection<object>
ます。したがって、リフレクションを使用してCopyToメソッドを呼び出したとしても、特定のタイプのReadOnlyCollectionを知る必要があります。これは、避けたいことです。
の特定のタイプ(T)を知らなくても、オブジェクト参照の配列としてReadOnlyCollectionからすべての要素を取得する方法を知りたいですReadOnlyCollection<T>
。
c# - ReadOnlyCollection<> に FindAll()、FindFirst()、
FxCop の提案と私の個人的な傾向に従って、私が指導しているチームに、可能な限り ReadOnlyCollections を使用するように勧めてきました。リストの受信者がその内容を変更できないようにするためだけに。彼らの理論では、これはパンとバターです。問題は、List<> インターフェースが、あらゆる種類の有用なメソッドを公開するよりリッチであることです。なぜ彼らはその選択をしたのですか?
書き込み可能なコレクションをあきらめて返すだけですか? 読み取り専用のコレクションを返し、書き込み可能なコレクションにラップしますか? ああああ。
更新: ありがとうございます。私はフレームワーク デザイン ガイドラインに精通しており、チームが FxCop を使用してそれを実施している理由です。しかし、このチームは VS 2005 を使用しているため (わかっています、わかっています)、LINQ/Extension メソッドが問題を解決すると言って彼らを悲しませています。
彼らは、List.FindAll() と .FindFirst() が foreach ループを記述するよりも明確になることを学びました。今、私は彼らに ReadOnlyCollections を使用するように勧めています。彼らはその明快さを失います。
たぶん、私が気付いていないより深い設計上の問題があるのでしょう。
-- 申し訳ありませんが、元の投稿で VS2005 の制限について言及する必要がありました。ずっと一緒に住んでるから気づかない。
c# - .NET 4.0 の読み取り専用リストまたは変更不可能なリスト
私が知る限り、.NET 4.0 にはまだ読み取り専用リストがありません。フレームワークにまだこの機能がないのはなぜですか? これは、ドメイン駆動設計の最も一般的な機能の 1 つではありませんか?
Java が C# より優れている数少ない利点の 1 つは、これがCollections.unmodifiablelist(list)メソッドの形式であることです。
IEnumerable<T>
質問に対する最も簡単な解決策は、使用ToList
することです。使用してコピーを返すことができます。
c# - メソッド呼び出し元が返されたコレクションを変更できないようにするにはどうすればよいですか?
プライベートコレクションを呼び出し元に返すメソッドがあり、呼び出し元が返されたコレクションを変更できないようにしたい。
現時点ではプライベートコレクションは固定配列ですが、実行時に新しいアイテムを追加する必要が生じた場合、将来的にコレクションがリストになる可能性があります。
呼び出し元がコレクションを変更できないようにするための解決策がいくつかあります。戻りIEnumerable<T>
値は最も簡単な解決策ですが、呼び出し元は戻り値をコレクションにアップキャストしてIList<T>
変更することができます。
コレクションのクローンを作成することには、独立して進化できる2つのコレクションがあるという明らかな欠点があります。これまで、次のオプションを検討してきました。
- コレクションをでラップし
ReadOnlyCollection<T>
ます。 Enumerable
のようなダミーの射影を実行することにより、クラスによって定義されたLINQイテレータの1つを返しますlist.Select(item => item)
。Where(item => true)
返されたイテレータの方が軽量に見えるので、実際に使用することを検討します。- カスタムラッパーを作成します。
私が使用するのが好きではないのReadOnlyCollection<T>
は、それが実装されており、インデクサーをIList<T>
呼び出しAdd()
たりアクセスしたりすると例外が発生することです。これは理論的には絶対に正しいですが、実際のコードチェックIList<T>.IsReadOnly
やIList<T>.IsFixedSize
。
LINQイテレータを使用すると(コードを拡張メソッドでラップしましたMakeReadOnly()
)、このシナリオを防ぐことができますが、ハックのような味がします。
カスタムラッパーを作成しますか?車輪の再発明?
考え、考慮事項、またはその他の解決策はありますか?
この質問にタグを付けているときに、以前は気づかなかったこのStackOverflowの質問を発見しました。Jon Skeetも「LINQハック」を使用することを提案していますが、を使用するとさらに効率的Skip(0)
です。
.net - ReadOnlyCollection について魔法はありますか
このコードを持っている...
2 行目でコンパイル エラーが発生します。ReadOnlyCollection<T>
実装IList<T>
とインターフェイスthis[T]
にセッターがあるため、実行時エラーが発生することが予想されIList<T>
ます。
ReadOnlyCollection の機能を複製しようとしましたが、セッターを削除するthis[T]
とコンパイル エラーが発生します。
vb.net - BindingSource / BindingNavigator:バインドされたデータソースの編集を防ぐ方法は?
VB.NETとVisualStudio2005を使用してデータソースを作成しました。データソースをダイアログにドラッグすると、VSはリンクされたオブジェクトのメンバーであるaSystem.Windows.Forms.BindingSource
と。を含むテキストボックスを作成しましたSystem.Windows.Forms.BindingNavigator
。
リスト(myListと呼ばれる)にデータを入力し、BindingSourceでmyListをDataSourceとして設定すると、これを読み取り専用にしたいという事実を除いて、物事はうまく機能します。ユーザーがテキストボックスの1つで何かを変更すると、変更が保存されます。
BindingSourceにバインドする読み取り専用コレクションを作成しようとしましたが、問題は解決しませんでした。
すべてのテキストボックスを無効にできると思いますが、それは少し手間がかかるようです。さらに、読みやすくするためにフォントの色を変更したいと思います。
理想的には、ユーザーがテキストボックスにフォーカスを設定したり、コンテンツを編集したりできるかどうかは気にしないでしょうが、変更を保持したくないだけです。つまり、誰かが何かを編集し、ナビゲーターを使用して次のレコードに移動してから戻ってきた場合、ユーザーがそれを再生する前の状態のままにしておく必要があります。
何か提案/ガイダンスはありますか?
前もって感謝します!
automapper - AutoMapper は ReadOnlyCollections をサポートしていますか?
さまざまな構成を試しましたが、機能しません。サポートされているか心配です。
.net - SortedList(TKey,TValue).Keys プロパティが ReadOnlyCollection(TKey) ではなく IList(TKey) であるのはなぜですか?
インターフェイスには、、、などのプロパティIList<T>
でサポートされていない操作に加えて、インデックスによるアクセスが含まれます。SortedList<TKey, TValue>.Keys
Add
Remove
Insert
のReadOnlyCollection<T>
戻り値などのList<T>.AsReadOnly
は実装されIList<T>
ているため、インデックスによるアクセスを提供しますが、 などの不正な操作をAdd
明示的に実装することで隠します。さらに、これは基になるリストの単なるラッパーです。そのため、コピーは作成されないため、実際のパフォーマンスに影響を与えることはありません (私はそう思います)。
なぜSortedList<TKey, TValue.Keys
ではないのReadOnlyCollection<TKey>
ですか?(さらに言えば、Values
プロパティが ではないのはなぜReadOnlyColllection<TValue>
ですか?)
c# - 返されたディクショナリを変更できない方法でディクショナリのアクセサを作成する方法C#/ 2.0
コレクションが非常に少ないので、以下の解決策を考えました。しかし、それが大きかった場合はどうなりますか?
リストを使用すると、次のことができます。
それはいいね!
よろしくお願いします、Cheers&BR-Matti
コレクション内のオブジェクトがヒープにあると思うとき。だから私の解決策は、それらを変更するために発信者を妨げません!!! 原因両方のディクショナリに同じオブジェクトへの参照が含まれています。これは上記の例のリストに適用されますか?
では、これを不変にする方法は??