2012-04-23 4 views
3

Предположим, у меня есть DataTable с пятью столбцами. Мне любопытно, почему следующие работы:Добавление столбцов в DataTable с использованием SetOrdinal

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 («Бла»); dt.Columns ["Blah"]. SetOrdinal (dt.Columns.Count-1); Но на самом деле это NOP, так как в любом случае новый столбец будет добавлен в конец. Это был бы более интересный пример, который перемещает новый столбец в начало: dt.Columns.Add («Бла»); dt.Columns ["Blah"]. SetOrdinal (0); –

+0

Я пытался улучшить форматирование, но я думаю, что не могу. –

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] 
Смежные вопросы