3

5つの列を持つ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 に答える