0

次のようなデータ構造を探しています。

position      whoCares    bla           ...
200.001890     -0.00110    -0.100000
199.997990     0.000790    -2.200000
199.952110     0.026330    -28.900000
199.780060     0.116370    -60.400000
199.321650     0.349330    -154.200000
198.242900     0.901430    -248.700000
196.447890     1.816030    -289.200000
...            ...         ...

タグを追加するか、列に新しいデータを追加することで、テーブルを両方の次元で拡張できます。データ サイズは、3 ~ 20 列、1 列あたり 100 ~ 10000 の double の範囲です。

これは、1 つのクラス インスタンスとして 1 つのデータ セットとして定義する必要があります。データ アクセスは次のようになります。

double[] Get(string tag)             // data.Get("position")
double Get(string tag, int index)    // data.Get("position", 17)
...

Dictionary<string, double[]>またはを使用するだけで、これまでのところ簡単Dictionary<string, List<double>>です。

現在、これはスレッドセーフである必要があり、優れたパフォーマンスが得られるはずです。しかし、単純なデータ アクセスは、パフォーマンスよりも重要です。

double[] Get(...)参照を返すとマルチスレッド シナリオで問題が発生するため、 は内部データのコピーを返すことに注意してください。通常、1 人のライターと 1 ~ 3 人のリーダーが存在します。

と のようないくつかのことDictionary<string, double[]>を試しました。double[]List<double>

これに最適な方法は何ですか?C# 2.0 を使用するための他のデータ コンテナー/構造はありますか?


編集:

このクラスは、ハードウェアからすべてのデータを読み取る 1 つのライター スレッドによって埋められるデータ コンテナーとして機能する必要があります。アプリケーションの実行中、UI スレッドは単に図を描画するためにそのデータを読み取ります。

2 番目のシナリオは、以前と同様にライター スレッドですが、UI スレッドは、そのデータに対して計算を実行し、結果を 2 番目のデータ インスタンスに格納するスレッドに置き換えられます。このスレッドは、UI によって表示されます。

4

1 に答える 1

1

別の方法は、多次元配列を使用することです。これは、パフォーマンスが向上する可能性があります。

object[] table = new object[2];
table[0] = new string[x]; // Tags
table[0][0] = "tag";  // Example for a tag, you may iterate it

object[] doubles = new object[x];
doubles[0] = new double[y]; // Example for a column, you may iterate it

table[3] = doubles; // Doubles table

このようにして、別の配列内に 2 つの配列ができます。

x = 列数、y = 行数であることに注意してください。

于 2012-06-21T06:24:12.680 に答える