0

Javascript、AS3、Python など、デフォルトで型なしデータ配列をサポートおよび推奨するプラットフォームでは、配列は通常、任意のユーザー データをメモリに格納する最も簡単で効果的な方法です。(表形式のデータ、CSV からのデータ、JSON からのデータなど)

ただし、.NET は厳密に型指定された形式のすべてを好みます。配列に何かをダンプすることはできませんがList<object>、機能しますが、処理が遅くなり、扱いにくくなります(型チェック、使用ごとの型キャスト)。そのため、通常はデータ スキーマをクラスとして定義し、プロパティを列に対応させ、データをそのクラスのインスタンスに格納することになります。

では、開発時に「ハードコード」できないスキーマ (CSV や JSON など) がアップグレードし続ける場合は特に、任意のデータをメモリに格納するための推奨される方法は何ですか。

編集:このようなデータには、数値 (int/float)、文字列、日付、時刻、単位、地理空間データ、幾何学的データ、埋め込みファイル、基本的に MySQL データベースまたは JSON ファイルが保存できるすべてのものを含めることができます。

編集:メモリ内にある間、このデータはあらゆる種類の処理に使用できます。グラフを生成する計算、部分文字列でデータを検索する文字列処理、地理空間/3D データの数値計算アルゴリズムなど、ダーティ データを検証して冗長データを最適化する最適化アルゴリズムなど。

4

4 に答える 4

2

Dictionary<string,object>動的オブジェクトを使用して個々のアイテムを保存するために (4.0+) を使用または検討する 1 つの可能なアプローチ。アイテムをリストまたは配列または辞書に再度入れるよりも。

場合によっては、オブジェクトに関する何らかのメタデータが必要になることもあります。つまり、プロパティ名から {タイプ、制限、検証規則、その他すべて} へのマッピング。

于 2012-09-16T19:02:44.493 に答える
2

質問のいくつかのステートメントに同意しません。

まず、「何もダンプできませんobject[]」。間違い!object[]すべてがオブジェクトなので、何でもダンプできます。必要なものにのみキャストできる必要があります。

第二に、「遅い」。また嘘!普通の古い配列は、どこを見ればよいかがわかればすぐにアクセスできる最速のコレクションです。配列内の特定の要素にアクセスするには O(1) かかります。

CSV を C# クラスに保存する必要がある場合は、考えることができますSystem.Data.DataTableが、最も一般的なのは間違いなくobject[]であり、その各要素自体が別のものobject[]になり、目的の深度レベルに到達する可能性があります。

本当にランダムアクセスが必要な場合Dictionary<string,object>は、アレクセイが述べたように行かなければなりません

編集:ここに例があります

void ScanCollection(object[] collection)
{
    foreach (object item: collection)
    {
        if (item is string)
        ///Treat as string
        else if (item is float)
        ///Treat as float
        else if (item is SomethingElse)
        ///Treat as SomethingElse class

    }
}
于 2012-09-16T19:15:53.080 に答える
1

ここにはおそらくいくつかの方法があります。

リフレクションを介してプログラムでクラスを作成できます。

C#でクラスを動的に作成するには?

次に、ジェネリック コレクションといくつかの LINQ to Objects を使用してデータをクエリします。

または、任意のデータソースからオンザフライで独自のデータソースまたはデータテーブルを使用または作成し、ロジックに応じて好きなタイプにすることができます。データベースがデータテーブルの列のタイプを確認できる場合。次に、データテーブル オブジェクトの select メソッドを使用してデータテーブルをクエリできます。

于 2012-09-16T21:18:39.160 に答える
1

.NET でオブジェクトの配列が失敗した場所はありますか?

オブジェクトは 5 つのメソッドしかサポートしていないため、肉はあまりありません。

オブジェクト メンバー

私の知る限り、すべてのコレクション サポート オブジェクト。

    List<Object> lObjs = new List<object>();
    HashSet<Object> hObjs = new HashSet<object>();
    Dictionary<int, Object> dObjs = new Dictionary<int, object>();
    Object[] aObjs = new Object[10];

    aObjs[0] = "string";
    aObjs[1] = 1d;
    aObjs[2] = new object();
于 2012-09-16T19:31:40.220 に答える