0

storyCharacterオブジェクトのリストがあったとしましょう。各オブジェクトには、次の例のように、ID番号、名前、およびお気に入りの色が格納されます。

ID#   |  Name        |  Favorite Color
21    |  Optimus     |  Blue
29    |  Ironhide    |  Red
34    |  Starscream  |  White

ID#にキー設定されるように、キーと値のペアを作成するための最良の方法は何でしょうか。

辞書を使用できることは知っていますが、

dictionary.Add(storyCharacter1.IDnum, storyCharacter1);

それを行うための良い方法になりますか?その方法では、IDのコピーがキーとして作成され、その情報がすでにオブジェクトに含まれているため、不必要に多くのメモリを消費すると思います。もちろん、IDnumをstoryCharacterオブジェクトに格納して、それをキーとして使用することはできませんでした。これにより、名前と色だけでオブジェクトが作成され、IDnumのキーに関連付けられるため、一緒に保持する必要のあるデータを分離しているように感じます。

List <>を使用することもできますが、その場合は、foreachして調べるか、LINQを使用する必要があります。

それで、(ある種の)オブジェクトのリストを保存し、そのオブジェクトの1つの要素をキーとして識別する方法はありますか?そうでない場合、同様のことを行うためにどのような選択肢があり、それらはトレードオフですか?

4

2 に答える 2

2

そのような辞書を作成することは、何かを検索するのをスピードアップするための一般的で完全に有効な方法です。より多くのメモリを使用してより多くのパフォーマンスを得るのは、一般的なトレードオフです。

IDNumがdouble(疑わしい)の場合、辞書はキーごとに最大で8バイトを使用しますが、それ以外の場合はキーごとに4バイトを使用します。IDNumがオブジェクトの場合、オブジェクト全体をそのオブジェクトへの参照だけでコピーすることはありません(32ビットシステムでは4バイトを使用します)。

しかし...あなたは本当に記憶の懸念がありますか?これは組み込みデバイスまたはメモリの少ないものですか?時期尚早の最適化(速度とメモリの両方)はしばしば悪いことです。私はあなたの全体的なデザインに行き、後でメモリ/パフォーマンスの問題に対処します。

于 2013-03-13T18:07:26.567 に答える
1

あなたはただ...メモリであるメモリ内データストアについて話している。

これを行うための「最善の方法」を求めますが、条件を指定しないでください。オブジェクトのコレクションをメモリに格納するための推奨される方法は、配列またはを使用することList<>です。そして、はい、LINQでそれを繰り返します。LINQは、実行時の最適化を含めて非常によく最適化されています。このアプローチが遅すぎる、またはメモリを大量に使用するユースケースである可能性はほとんどありません。

データセットが実際に非常に大きく(この場合、メモリ内は不適切な選択のように思われます)、ルックアップ時間が心配な場合は、Dictionary<>かなり安定したパフォーマンスが得られます。

しかし、おそらくあなたが望むのは、実際にはオブジェクトデータベースのようなものです。db4oを検討してください。または、ドキュメントデータベースについては、RavenDb(またはmonogo、redisなど)を検討してください。Ravenには、インプロセスで実行できる埋め込みモードがあります。

繰り返しになりますが、メモリ内のものの場合、これはすべて衒学的です-ビルトインを使用するだけDictionary<>で問題になるのを見たことがないかなり大きなデータセットに対してさえ。

于 2013-03-13T18:07:45.983 に答える