使用SetOrdinal将列添加到DataTable

Sid*_*and 3 c#

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

dt.Columns.Add("Blah").SetOrdinal(5);
Run Code Online (Sandbox Code Playgroud)

但以下抛出ArgumentOutOfRangeException:

dt.Columns.Add("Blah").SetOrdinal(dt.Columns.Count);
Run Code Online (Sandbox Code Playgroud)

我也试过了

dt.Columns.Add("Blah").SetOrdinal(dt.Columns.Count - 1);
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*rgy 5

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

是.

在评估最后一部分时:

.SetOrdinal(dt.Columns.Count);
Run Code Online (Sandbox Code Playgroud)

dt.Columns.Count == 6.一般来说,你应该避免使用引用同一语句中变化的复合语句.虽然评估顺序是可预测的,但它并不是特别直观 - 你最终会犯错误.这个更好:

var count = dt.Columns.Count;
dt.Columns.Add("Blah").SetOrdinal(count);
Run Code Online (Sandbox Code Playgroud)

甚至更好:

dt.Columns.Add("Blah");
dt.Columns.SetOrdinal(dt.Columns.Count-1);
Run Code Online (Sandbox Code Playgroud)

不要只是为了缩短代码来缩短代码.如果保存几个字符(这在编译代码中实际上没有任何意义)使得意图不那么明确,那么它绝对不值得.