2

キー、順序、またはその他の明らかなインデックスのないオブジェクトのコレクションがあります。

各オブジェクトに関するデータを DataTable に格納したいと考えています。これを行うエレガントな方法は、所有者列に参照を保存し、その列を type にすることだと思いましたtypeof(MyClass)

ただし、実際にこれを実行しようとすると、機能しません (主キーが衝突すると言います)。インスタンスを行フィールドに入れると、フィールドに " MyProgram.MyClass" が書き込まれるだけtoStringであることがMyClass判明しstringました。

LINQPad で動作するサンプル コードを次に示します。

void Main()
{
    // Create a table
    var table = new DataTable();

    var ownerColumn = new DataColumn("Owner", typeof(MyClass));

    var primaryKey = new[] { ownerColumn };

    table.Columns.AddRange(primaryKey);
    table.PrimaryKey = primaryKey;

    table.Columns.Add(new DataColumn("Some Data", typeof(int)) { DefaultValue = 0 });

    // Create 2 objects
    var c1 = new MyClass();
    var c2 = new MyClass();

    // Store their data in the table
    var row = table.NewRow();
    row["Owner"] = c1;
    row["Some Data"] = 1;
    table.Rows.Add(row);

    row = table.NewRow();
    row["Owner"] = c2;
    row["Some Data"] = 2;
    table.Rows.Add(row);
}

// Define other methods and classes here
class MyClass {

}

これを解決するにはどうすればよいですか? idでフィールドを作成しMyClass、それを使用idして所有者列に入力し、作成時に各オブジェクトが一意になるようにする必要がありますidか?

4

2 に答える 2

2

列の値を比較する方法を知るために、System.IComparable(非ジェネリック バージョンの) インターフェイスを実装する必要があります。このインターフェイスが定義されていない場合、コードは object.ToString() の結果の比較にフォールバックします。MyClassDataTable

于 2012-11-05T14:04:00.553 に答える
1

自動インクリメント列を使用できます:

DataTable dTable = new DataTable();
DataColumn auto = new DataColumn("AutoID", typeof(System.Int32));
dTable.Columns.Add(auto);
auto.AutoIncrement = true;
auto.AutoIncrementSeed = 1;
auto.ReadOnly = true;
于 2012-11-05T13:02:35.293 に答える