現時点では、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を取得するメソッドが必要でした。または、少なくとも行で直接含むメソッド。
何か不足していますか?そのように多くのフィールドにマッピングするので、コードは恐ろしく読めないように見えます...
拡張メソッドを作成して、よりクリーンにすることができます。
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") };
DataTableテーブルには常に同じ列があるため(行ごとに変化しません)、列名を1回確認するだけで済みます。
if (table.Columns.Contains("donkey"))
{
foreach ...
}
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;
};
}