3

假设我有一个包含五列的 DataTable。我很好奇为什么以下工作:

dt.Columns.Add("Blah").SetOrdinal(5);

但以下抛出一个ArgumentOutOfRangeException

dt.Columns.Add("Blah").SetOrdinal(dt.Columns.Count);

我也试过

dt.Columns.Add("Blah").SetOrdinal(dt.Columns.Count - 1);

哪个有效,但我不完全确定为什么。它是否与在执行之前添加的列有关SetOrdinal,从而增加了超出列范围的计数?

4

3 回答 3

5

“它是否与在执行 SetOrdinal 之前添加的列有关”

是的。

在评估最后一部分时:

.SetOrdinal(dt.Columns.Count);

dt.Columns.Count == 6. 一般来说,您应该避免引用在同一语句中更改的内容的复合语句。尽管评估顺序是可预测的,但它并不是特别直观——你最终会犯错误。这个更好:

var count = dt.Columns.Count;
dt.Columns.Add("Blah").SetOrdinal(count);

甚至更好:

dt.Columns.Add("Blah");
dt.Columns.SetOrdinal(dt.Columns.Count-1);

不要为了缩短代码而试图缩短代码。如果保存几个字符(这在编译代码中实际上没有任何意义)会使意图变得不那么清晰,那么它绝对不值得。

于 2012-04-23T20:34:36.767 回答
1

序数是从零开始的,使用时需要考虑到这一点Count

例子:

dt.Columns.Count = 5;

//1. dt.Columns[0]
//2. dt.Columns[1]
//3. dt.Columns[2]
//4. dt.Columns[3]
//5. dt.Columns[4]
于 2012-04-23T20:38:44.600 回答
0

DataColumn 将从“0”开始

您第一次将列添加到数据表中并使用 SetOrdinal 的更好方法

DataColumn newcol=new DataColumn("Blah", typeof(string));
dt.Columns.Add(newcol);
newcol.SetOrdinal(dt.Columns.Count-1);
于 2019-03-05T23:27:49.633 回答