2012-04-23 16 views
3

5つの列を持つ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

さて、あなたに感謝し、説明しました。あまり明確ではないコードを避けるための良いアドバイス。 –

+0

これはちょっと古いですが、あなたはこれを代わりに意味すると思います。 dt.Columns.Add( "Blah"); dt.Columns ["Blah"]。SetOrdinal(dt.Columns.Count-1); 本当にこれはNOPです。なぜなら、新しい列が最後に追加されるからです。これは、新しい列を最初に移動する、より興味深い例です。 dt.Columns.Add( "Blah"); dt.Columns ["Blah"]。SetOrdinal(0); –

+0

私はより良いフォーマットをしようとしましたが、私はできないと思います。 –

1

序数は0から始まります。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] 
関連する問題