2

我有一组没有键或顺序或其他明显索引的对象。

我希望将有关每个对象的数据存储在 DataTable 中。我认为这样做的一种优雅方法是将引用存储在所有者列中,并使该列类型为typeof(MyClass).

但是,当我在实践中尝试这样做时,它不起作用(它说主键冲突)。事实证明,将实例放入行字段只是将“ MyProgram.MyClass”写入该字段 -toString即使该行的类型应该是MyClassnot的输出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(非通用版本)接口,MyClass以便DataTable知道如何比较列的值。如果未定义此接口,则代码将退回到比较 object.ToString() 结果。

于 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 回答