問題タブ [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# - IReadOnlyList からの Encoding.GetString
IReadOnlyList<byte>
特定の を指定して、 から文字列を取得する方法はありEncoding
ますか?
より正確には、コレクションの内容を Encoding オブジェクトに渡す前にコピーしない方法はありますか?
私の主な関心事はパフォーマンスであり、次にメモリ使用量です。
c# - 取得されたディクショナリ キーが見つかりません
私は次のSortedDictionary
ように宣言しました:
値が入力されたときに、辞書からキーを取得してすぐに参照しようとすると、次のようになりますKeyNotFoundException
。
デバッガーで (エラーの後) 辞書にカーソルを合わせると、参照しようとしたのと同じキーが実際に辞書に含まれていることがはっきりとわかります。ReadOnlyCollection
ofを使用して辞書にデータを入力していMyObjects
ます。そこで何かおかしなことが起きているのではないでしょうか?==
演算子とメソッドをオーバーライドしてEquals
、必要な明示的な比較を取得しようとしましたが、そのような運はありませんでした。実際には から直接キーを取得し、同じキーを使用してDictionary
クエリを実行しているので、それは問題ではありません。Dictionary
何が原因なのかわかりません。誰もこの行動を見たことがありますか?
編集1
オーバーライドEquals
では、(MS が推奨するように) オーバーロードも行いGetHashCode
ました。MyObject
興味のある人のための実装は次のとおりです。
デバッグから気付いたのKeyNotFoundException
は、式のクイック ウォッチを (がスローされた後に)追加すると、次のようになることです。
true を返します。どうすればいいの?
EDIT 2
したがって、問題はSortedDictionary
(およびDictionary
同様に)スレッドセーフではないためです。ディクショナリに対していくつかの操作を実行しているバックグラウンド スレッドがあり、それがコレクションの再利用を引き起こしているようです (コレクションに項目を追加すると、これが実行されます)。同時に、ディクショナリが値を反復処理してキーを見つけたときに、コレクションが変更されていて、そこにあるのにキーを見つけられませんでした。
このコードを求めてくれた皆さん、申し訳ありません。現在、継承したアプリケーションをデバッグしていますが、これが時限のバックグラウンド スレッドで行われていることに気づきませんでした。そのため、関連するすべてのコードをコピーして貼り付けたと思っていましたが、コレクションを操作するすべての背後で別のスレッドが実行されていることに気付きませんでした。
c# - コンストラクターで読み取り専用コレクションに追加しますか?
コンストラクターの読み取り専用コレクション プロパティに項目を追加できる ac# 言語構造はありますか? 私はこのようなことをしたい:
...私のコードのどこかに...
(良い例ではありませんが、これでアイデアが伝わることを願っています)...
アップデート
申し訳ありませんが、もっと明確にする必要があります。私はこのクラスを書いていないNode
ので、変更できません。Node
クラスが変更可能ではないと仮定して、2 番目のスニペットのパラメーターなしのコンストラクターで読み取り専用コレクションに追加できる ac# 言語の概念があるかどうかを尋ねています。
c# - ReadOnlyCollection を連結する方法
ReadOnlyCollection コンストラクターには、IList を指定する必要があります。しかし、連結して新しい ROC を生成したい ROC がいくつかある場合、Concat メソッドは IEnumerable を返します。これは、ROC コンストラクターに渡す有効な引数ではありません。
では、他の ROC を連結して ROC を作成するにはどうすればよいでしょうか。
これまでのところ、これは私が思いつくことができる最高のものです:
c# - ReadOnlyCollection から派生したクラスをシリアライズする方法
ReadOnlyCollection から派生した独自のクラスをシリアル化しようとすると、エラーが発生します。
CollectionDataContractAttribute 属性を持つ 'MyReadOnlyCollection`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' は、既定のコンストラクターがないため、無効なコレクション型です。
エラーは理にかなっています。デフォルトのコンストラクターがないのは本当です。ただし、ReadOnlyCollection にはパラメーターのない既定のコンストラクターがありませんが、DataContractSerializer を使用して ReadOnlyCollection をシリアル化できます。
2 つの質問:
- ReadOnlyCollection をシリアル化できるのに、派生クラスをシリアル化できないのはなぜですか?
- 派生クラスを正しくシリアル化するにはどうすればよいですか?
更新: 上記の派生クラスを追加しました
c# - ReadOnlyCollection の ReadOnlyCollection を公開しながら、クラス内で変更できる最善の方法
これが可能かどうかはわかりませんが、基本的には、プロパティを公開するReadOnlyCollection<ReadOnlyCollection<MyType>>
クラス内の基になるコレクションを変更しながら、 type のプロパティを公開したいと考えています。さらに、クラスのユーザーが返されたコレクションへの参照を保持できるようにして、プロパティを公開するクラスで内部的に更新すると更新されるようにします。
たとえば、これが単一のコレクションである場合、次のようにすることができます。
を実行することで、クラス内のリストにアイテムを追加することができ_List.Add()
ます。さらに、このクラスのクライアントが行う場合は、次のように言います。
次にcollectionRef
、要素をリストに追加すると、内部からも変更されMyClass
ます。
リストのリストが必要な場合、問題が発生します。
上記の試みの差し迫った問題はAsReadonly()
、外側のリストにのみ適用されることです。ReadOnlyCollection<List<MyItem>>
したがって、プロパティの宣言された型ではないa を返そうとします。宣言されたプロパティの型を満たすために私が考えることができる唯一の方法はReadOnlyCollection
、次のような方法で新しいを作成することです。
また
しかし、このネストされたコレクションを作成するための構文がどうなるかはわかりません。また、「新しい」コレクションを作成することで、プロパティによって返される値への参照を使用して、基になるリストへの変更を追跡できないかどうかもわかりません。つまり、私が内部MyClass
で行う場合_List[1].Add(myTypeInstance)
、読み取り専用バージョンへの参照を保持している誰かがその新しいアイテムを見るかどうかはわかりません。
私は正直に言って、他のアプローチにもオープンです。基本的には、読み取り専用であるがプロパティを公開するクラス内で変更できる項目のリストのリストを公開するだけで済み、クライアントはプロパティ アクセサーから値を再度取得することなく反映された変更を確認できます。
c# - 空の IReadOnlyCollection を作成する方法
頻繁なチェックをカプセル化するためにMultiValueDictionaryの拡張メソッドをContainsKey
作成していますが、空のIReadOnlyCollection
?.
私がこれまで使ってきたnew List<TValue>(0).AsReadOnly()
のIEnumerable
はEnumerable.Empty
c# - ReadOnlyCollection で共分散が許可されないのはなぜですか?
このコードが機能する理由は、Enumerator
がコレクションを変更できないためです。
List<object>
の代わりに, を使用して同じことを行おうとすると、暗黙的に型を にIEnumerable<object>
変換できないというコンパイラ エラーが発生します。わかりました、それは理にかなっており、私の意見では、配列から学んだ教訓として、Microsoft による良い決定でした。 List<string>
List<object>
しかし、私が理解できないのは、なぜ世界でこの強硬なルールが次のようなものに適用されるのReadOnlyCollection
ですか? の要素を変更することはできません。ReadOnlyCollection
では、Microsoft が読み取り専用のもので共分散を使用することを妨げた原因となった安全上の懸念は何ですか? ポインターなどを使用して、Microsoft が説明しようとしていたそのタイプのコレクションを変更する方法はありますか?