問題タブ [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.

0 投票する
2 に答える
327 参照

c# - IReadOnlyList からの Encoding.GetString

IReadOnlyList<byte>特定の を指定して、 から文字列を取得する方法はありEncodingますか?

より正確には、コレクションの内容を Encoding オブジェクトに渡す前にコピーしない方法はありますか?

私の主な関心事はパフォーマンスであり、次にメモリ使用量です。

0 投票する
3 に答える
2145 参照

c# - 取得されたディクショナリ キーが見つかりません

私は次のSortedDictionaryように宣言しました:

値が入力されたときに、辞書からキーを取得してすぐに参照しようとすると、次のようになりますKeyNotFoundException

デバッガーで (エラーの後) 辞書にカーソルを合わせると、参照しようとしたのと同じキーが実際に辞書に含まれていることがはっきりとわかります。ReadOnlyCollectionofを使用して辞書にデータを入力していMyObjectsます。そこで何かおかしなことが起きているのではないでしょうか?==演算子とメソッドをオーバーライドしてEquals、必要な明示的な比較を取得しようとしましたが、そのような運はありませんでした。実際には から直接キーを取得し、同じキーを使用してDictionaryクエリを実行しているので、それは問題ではありません。Dictionary何が原因なのかわかりません。誰もこの行動を見たことがありますか?

編集1

オーバーライドEqualsでは、(MS が推奨するように) オーバーロードも行いGetHashCodeました。MyObject興味のある人のための実装は次のとおりです。

デバッグから気付いたのKeyNotFoundExceptionは、式のクイック ウォッチを (がスローされた後に)追加すると、次のようになることです。

true を返します。どうすればいいの?

EDIT 2 したがって、問題はSortedDictionary(およびDictionary同様に)スレッドセーフではないためです。ディクショナリに対していくつかの操作を実行しているバックグラウンド スレッドがあり、それがコレクションの再利用を引き起こしているようです (コレクションに項目を追加すると、これが実行されます)。同時に、ディクショナリが値を反復処理してキーを見つけたときに、コレクションが変更されていて、そこにあるのにキーを見つけられませんでした。

このコードを求めてくれた皆さん、申し訳ありません。現在、継承したアプリケーションをデバッグしていますが、これが時限のバックグラウンド スレッドで行われていることに気づきませんでした。そのため、関連するすべてのコードをコピーして貼り付けたと思っていましたが、コレクションを操作するすべての背後で別のスレッドが実行されていることに気付きませんでした。

0 投票する
4 に答える
2057 参照

c# - コンストラクターで読み取り専用コレクションに追加しますか?

コンストラクターの読み取り専用コレクション プロパティに項目を追加できる ac# 言語構造はありますか? 私はこのようなことをしたい:

...私のコードのどこかに...

(良い例ではありませんが、これでアイデアが伝わることを願っています)...

アップデート

申し訳ありませんが、もっと明確にする必要があります。私はこのクラスを書いていないNodeので、変更できません。Nodeクラスが変更可能ではないと仮定して、2 番目のスニペットのパラメーターなしのコンストラクターで読み取り専用コレクションに追加できる ac# 言語の概念があるかどうかを尋ねています。

0 投票する
2 に答える
3634 参照

c# - ReadOnlyCollection を連結する方法

ReadOnlyCollection コンストラクターには、IList を指定する必要があります。しかし、連結して新しい ROC を生成したい ROC がいくつかある場合、Concat メソッドは IEnumerable を返します。これは、ROC コンストラクターに渡す有効な引数ではありません。

では、他の ROC を連結して ROC を作成するにはどうすればよいでしょうか。

これまでのところ、これは私が思いつくことができる最高のものです:

0 投票する
1 に答える
1616 参照

c# - ReadOnlyCollection から派生したクラスをシリアライズする方法

ReadOnlyCollection から派生した独自のクラスをシリアル化しようとすると、エラーが発生します。

CollectionDataContractAttribute 属性を持つ 'MyReadOnlyCollection`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]' は、既定のコンストラクターがないため、無効なコレクション型です。

エラーは理にかなっています。デフォルトのコンストラクターがないのは本当です。ただし、ReadOnlyCollection にはパラメーターのない既定のコンストラクターがありませんが、DataContractSerializer を使用して ReadOnlyCollection をシリアル化できます。

2 つの質問:

  1. ReadOnlyCollection をシリアル化できるのに、派生クラスをシリアル化できないのはなぜですか?
  2. 派生クラスを正しくシリアル化するにはどうすればよいですか?

更新: 上記の派生クラスを追加しました

0 投票する
2 に答える
1224 参照

c# - ReadOnlyCollection の ReadOnlyCollection を公開しながら、クラス内で変更できる最善の方法

これが可能かどうかはわかりませんが、基本的には、プロパティを公開するReadOnlyCollection<ReadOnlyCollection<MyType>>クラス内の基になるコレクションを変更しながら、 type のプロパティを公開したいと考えています。さらに、クラスのユーザーが返されたコレクションへの参照を保持できるようにして、プロパティを公開するクラスで内部的に更新すると更新されるようにします。

たとえば、これが単一のコレクションである場合、次のようにすることができます。

を実行することで、クラス内のリストにアイテムを追加することができ_List.Add()ます。さらに、このクラスのクライアントが行う場合は、次のように言います。

次にcollectionRef、要素をリストに追加すると、内部からも変更されMyClassます。

リストのリストが必要な場合、問題が発生します。

上記の試みの差し迫った問題はAsReadonly()、外側のリストにのみ適用されることです。ReadOnlyCollection<List<MyItem>>したがって、プロパティの宣言された型ではないa を返そうとします。宣言されたプロパティの型を満たすために私が考えることができる唯一の方法はReadOnlyCollection、次のような方法で新しいを作成することです。

また

しかし、このネストされたコレクションを作成するための構文がどうなるかはわかりません。また、「新しい」コレクションを作成することで、プロパティによって返される値への参照を使用して、基になるリストへの変更を追跡できないかどうかもわかりません。つまり、私が内部MyClassで行う場合_List[1].Add(myTypeInstance)、読み取り専用バージョンへの参照を保持している誰かがその新しいアイテムを見るかどうかはわかりません。

私は正直に言って、他のアプローチにもオープンです。基本的には、読み取り専用であるがプロパティを公開するクラス内で変更できる項目のリストのリストを公開するだけで済み、クライアントはプロパティ アクセサーから値を再度取得することなく反映された変更を確認できます。

0 投票する
5 に答える
13204 参照

c# - 空の IReadOnlyCollection を作成する方法

頻繁なチェックをカプセル化するためにMultiValueDictionaryの拡張メソッドをContainsKey作成していますが、空のIReadOnlyCollection?.

私がこれまで使ってきたnew List<TValue>(0).AsReadOnly()IEnumerableEnumerable.Empty

0 投票する
1 に答える
864 参照

c# - ReadOnlyCollection で共分散が許可されないのはなぜですか?

このコードが機能する理由は、Enumeratorがコレクションを変更できないためです。

List<object>の代わりに, を使用して同じことを行おうとすると、暗黙的に型を にIEnumerable<object>変換できないというコンパイラ エラーが発生します。わかりました、それは理にかなっており、私の意見では、配列から学んだ教訓として、Microsoft による良い決定でした。 List<string>List<object>

しかし、私が理解できないのは、なぜ世界でこの強硬なルールが次のようなものに適用されるのReadOnlyCollectionですか? の要素を変更することはできません。ReadOnlyCollectionでは、Microsoft が読み取り専用のもので共分散を使用することを妨げた原因となった安全上の懸念は何ですか? ポインターなどを使用して、Microsoft が説明しようとしていたそのタイプのコレクションを変更する方法はありますか?