web-dev-qa-db-ja.com

DataRowに特定の列が含まれているかどうかを確認するベストプラクティス

現時点では、DataRowインスタンスを繰り返し処理するときに、これを実行します。

foreach(DataRow row in table)
  return yield new Thingy { Name = row["hazaa"] };

遅かれ早かれ(つまり、より早く)、tableの列が欠落するdonkeyが得られ、うんちがファンにヒットします。いくつかの大規模なグーグル(約30秒)の後、次の保護構文を発見しました。

foreach(DataRow row in table)
  if(row.Table.Columns.Contains("donkey"))
    return yield new Thingy { Name = row["hazaa"] };
  else
    return null;

さて、これは最も単純な構文ですか?!本当に?フィールドが存在する場合はフィールドを取得し、そうでない場合はnullを取得するメソッドが必要でした。または、少なくともで直接含むメソッド。

何か不足していますか?そのように多くのフィールドにマッピングするので、コードは恐ろしく読めないように見えます...

43

拡張メソッドを作成して、よりクリーンにすることができます。

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") };
82
Varun K

DataTableテーブルには常に同じ列があるため(行ごとに変化しません)、列名を1回確認するだけで済みます。

if (table.Columns.Contains("donkey"))
{
    foreach ...
}
13
Heslacher
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;
    };
}
1
Driton