我有一组没有键或顺序或其他明显索引的对象。
我希望在DataTable中存储有关每个对象的数据。我认为这样做的一种优雅方式是在所有者列中存储引用,并使该列类型为typeof(MyClass)
。
然而,当我尝试在实践中这样做时,它不起作用(它说主键发生冲突)。事实证明,将实例放入行字段只是将“MyProgram.MyClass
”写入字段 - 可能是toString
的输出,即使该行的类型应该是MyClass
而不是{{1} }}
以下是一些在LINQPad中运行的示例代码:
string
我该怎么做才能解决这个问题?我是否必须在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
字段?
答案 0 :(得分:2)
您必须在System.IComparable
上实现MyClass
(非通用版本)界面,以便DataTable
知道如何比较列的值。如果未定义此接口,则代码将依赖于比较object.ToString()结果。
答案 1 :(得分: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;