Pour le moment, lorsque j'itère les instances DataRow, je le fais.
foreach(DataRow row in table)
return yield new Thingy { Name = row["hazaa"] };
Tôt ou tard (c'est-à-dire plus tôt), j'obtiendrai le table pour qu'il manque la colonne âne et le caca frappera le ventilateur. Après une longue recherche sur Google (environ 30 secondes), j'ai découvert la syntaxe de protection suivante.
foreach(DataRow row in table)
if(row.Table.Columns.Contains("donkey"))
return yield new Thingy { Name = row["hazaa"] };
else
return null;
Maintenant - est-ce la syntaxe la plus simple?! Vraiment? Je m'attendais à une méthode qui me donne le champ s'il existe ou null sinon. Ou au moins une méthode Contains directement sur la ligne.
Suis-je en train de manquer quelque chose? Je vais mapper dans de nombreux domaines de cette façon, le code sera terriblement illisible ...
Vous pouvez créer une méthode d'extension pour la rendre plus propre:
static class DataRowExtensions
{
public static object GetValue(this DataRow row, string column)
{
return row.Table.Columns.Contains(column) ? row[column] : null;
}
}
Maintenant, appelez-le comme ci-dessous:
foreach(DataRow row in table)
return yield new Thingy { Name = row.GetValue("hazaa") };
Comme votre table DataTable a toujours les mêmes colonnes (elles ne changeront pour aucune ligne), vous ne devez vérifier le nom de la colonne qu'une seule fois.
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;
};
}