Лучшая практика, чтобы проверить, содержит ли DataRow определенный столбец
В настоящий момент, когда я повторяю экземпляры DataRow, я делаю это.
foreach(DataRow row in table)
return yield new Thingy { Name = row["hazaa"] };
Рано позже (то есть раньше), я получу таблицу, чтобы пропустить столб осла, и poo попадет в вентилятор. После некоторого обширного поиска (около 30 секунд) я обнаружил следующий синтаксис защиты.
foreach(DataRow row in table)
if(row.Table.Columns.Contains("donkey"))
return yield new Thingy { Name = row["hazaa"] };
else
return null;
Теперь - это самый простой синтаксис?! В самом деле? Я ожидал, что метод получит поле, если оно существует, или null в противном случае. Или, по крайней мере, метод Содержит непосредственно в строке.
Я что-то упустил? Я буду отображать во многих полях таким образом, чтобы код выглядел ужасно нечитаемым...
Ответы
Ответ 1
Вы можете создать метод расширения, чтобы сделать его более чистым:
static class DataRowExtensions
{
public static object GetValue(this DataRow row, string column)
{
return row.Table.Columns.Contains(column) ? row[column] : null;
}
}
Теперь назовите его, как показано ниже:
foreach(DataRow row in table)
return yield new Thingy { Name = row.GetValue("hazaa") };
Ответ 2
Поскольку ваша таблица DataTable всегда имеет одинаковые столбцы (они не изменяются для любой строки), вам нужно только один раз проверить имя столбца.
if (table.Columns.Contains("donkey"))
{
foreach ...
}
Ответ 3
foreach (DataColumn item in row.Table.Columns)
{
switch (item.ColumnName)
{
case "ID":
{
p.ID = Convert.ToInt32(row[item.ColumnName].ToString());
}
break;
case "firstName":
{
p.firstName = row[item.ColumnName].ToString();
}
break;
case "lastName":
{
p.lastName = row[item.ColumnName].ToString();
}
break;
default:
break;
};
}