2012-04-23 35 views
3

假设我有一个包含五列的DataTable。我很好奇,为什么以下工作:使用SetOrdinal将列添加到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之前添加的列有关,从而增加了超出列范围的计数?

回答

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); 

不要试图让你的代码只是为了使它更短的缘故短。如果保存几个字符(这在编译代码中没有任何意义)使得意图不太清晰,那么它绝对不值得。

+0

很好的解释,谢谢。避免不太清楚代码的好建议。 – 2012-04-23 21:29:55

+0

这是有点旧,但我认为你的意思是: dt.Columns.Add(“Blah”); dt.Columns [“Blah”]。SetOrdinal(dt.Columns.Count-1); 但是,真的这是一个NOP,因为无论如何,新列将被添加到结尾。这将是一个更有趣的示例,它将新列移到开头: dt.Columns.Add(“Blah”); dt.Columns [“Blah”]。SetOrdinal(0); – 2016-08-11 18:21:54

+0

我试图得到更好的格式,但我想我不能。 – 2016-08-11 18:27:22

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]