Подтвердить что ты не робот

Лучшая практика, чтобы проверить, содержит ли 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 в противном случае. Или, по крайней мере, метод Содержит непосредственно в строке.

Я что-то упустил? Я буду отображать во многих полях таким образом, чтобы код выглядел ужасно нечитаемым...

4b9b3361

Ответ 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;
    };
}