2012-04-23 102 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]