2010-12-03 11 views
4

私はちょうど静的なデータの参照だけで人口密度の高いハッシュテーブルを持っています。コンパイル時にルックアップテーブルを作成することはできますか? C#

これは、プログラムの開始時に、私が作成したリソースファイルから多くのhashtable.Add()メソッド(yuk)を実行するか、またはデシリアライズするための長い初期化子/コーディング時に。

コンパイル時にこのデータを含めるために使用できる属性や別の方法がありますか?

+0

あなたが書いたコードの量、またはあなたが心配しているコードの速度が分かるかもしれませんか? – MerickOWA

+0

ありがとう、MerickOWA。それは両方です。シリアライズされたデータを取得するためにカスタムプログラムを作成しなければならないのは、うーん、エレガントではありません。実行時にエントリを1つずつ読み込むと、コーディングは少なくなりますが、読み込み時間が増えます。 – MandoMando

+0

私は、その目的のためだけに設計されたプログラミング言語でなければ、小/高速/エレガントをすべて1つのソリューションで見つけるつもりはないと思います。 – MerickOWA

答えて

2

テーブルの内容によって異なります。常にリソースファイルを使用できます。あなたは、実行時にハッシュテーブルをロードしたくない場合は、これを扱うことができ

http://msdn.microsoft.com/en-us/library/ekyft91f.aspx

+0

私は既に質問のリソースファイルについて話しました。リソースデータを自動的に作成する方法を知っていますか? – MandoMando

+0

これはXMLファイルなので、ビルド前のプロセスの一環としてオプションを設定してファイルを作成し、コンパイルすることができます。それは私がそれをすることについて考えることができる最善の方法についてです。 – kemiller2002

0

方法は、データベース内のデータを格納し、いずれかのクエリやLINQで検索を実行することです。そこにいくつかのオプションは、 SQLLiteSqlServerCE場合は、デスクトップ指向のものがほしいと思う場合。また、アプリケーションのスコープに応じて、SqlServerやMySqlのようなより堅牢なものを使用することもできます。

+0

それは実行時にまだ入力されます。 –

+0

もちろん、コンストラクタで_values.Addコールの大きなリストは必要ありません。リストを頻繁に変更するものであれば、それを扱う方法のほんの一例ですが、ハードコードはしていません。しかし、それが永久的なリストであれば、これはうまくいくでしょう。コレクションを構築してシリアライズしてシリアライズされたバージョンからロードしたとしても、ファイルからリソースをロードするよりもパフォーマンスが低下することはわかりませんが、まだコレクションを埋める必要があります。 – pstrjds

+0

'HashSet'は' HashTable'と同じコンセプトではありません。 –

0

HashTableのインスタンスを実行時に実行するには、実行時にHashTableのインスタンスを割り当てて移入する必要があります。

値で決定したい場合は、メソッドを書くことができます。

1

概念的には、コンパイル時にオブジェクトを設定することはできません。オブジェクトは、.NETランタイムによって割り当て/構築され、何らかの形でデータが書き込まれている必要があります。

これをもっと速くするには、遅いAdd呼び出しがすべて実行された後に、Hashtableをバイナリファイルにシリアル化してみてください。

メインアプリケーションでは、必要に応じてシリアル化することができます。

これは、多くの.Add呼び出しとは対照的に、HashTableの初期化を高速化することに役立ちます。

3

データが厳密に静的である(またはプログラム内でハードコードできるほど静的な)場合は、すべての値をswitch文に入れることができます。それが良いアイデアであるかどうかは実際には言えませんが、HashTableを読み込むよりも悪くはありません。値の数が多い場合は、コードを生成するスクリプトを書くのではなく、手でそれを入力することができ

public int Lookup(int key) 
{ 
    switch (key) 
    { 
    case K1: return V1; 
    case K2: return V2; 
    case K3: return V3; 
    case K4: return V4; 
    case K5: return V5; 
    case K6: return V6; 
    case K7: return V7; 
    default: return V_WHOOPS; 
    } 
} 

:プラス側では、「ハッシュテーブル」の初期化は、厳密には、コンパイル時の動作になるん。

+0

wageoghe、すべてのルックアップで約500件の条件を実行するのは良い形式ではありません。 20項目以下の場合は、おそらく。 – MandoMando

+0

私は多くの条件が実際に起こるとは思わない。 switch vs ifのパフォーマンスについては、この記事を参照してください。 http://stackoverflow.com/questions/445067/if-vs-switch-speed – wageoghe

+0

http://stackoverflow.com/questions/395618/if-else-vs-switchここには(私の答えで)リリースモードでは、switch文の検索はO(1)にすることができます。 switch文がHashTableより速いとは言えませんが、テストするだけで十分です。それが速ければ、それを使用してください。そうでない場合は、実行時にHashTableを生成する方法を理解するという元の問題に戻ります。 – wageoghe

関連する問題