目前,当我遍历 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 。或至少直接在行上的包含方法。
我错过了什么吗?我将以这种方式在许多领域进行映射,因此代码看起来会非常难以理解......
答案 0 :(得分:77)
您可以创建一个扩展方法,使其更清晰:
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") };
答案 1 :(得分:12)
由于您的DataTable表始终具有相同的列(它们不会对任何行进行更改),因此您只需要检查一次列名。
if (table.Columns.Contains("donkey"))
{
foreach ...
}
答案 2 :(得分:2)
有时列名可能存在,但是一行不包含该列的数据;例如,在使用ReadXML填充DataTable之后。
一种简单,快速且安全的解决方案是使用类型检查:
if(row["columnname"].GetType() != typeof(System.DBNull)){
//DataRow contains "columname"
}else{
//a safe scope to set default cell data
}
答案 3 :(得分:2)
我真的很喜欢@Varun K 采取的方法。所以,以它为出发点,我只想投入我的两分钱,以防它对其他人有所帮助。我只是对其进行了改进,使其成为通用,而不是仅使用 object 作为返回类型。
static class Extensions
{
public static T Get<T>(this DataRow self, string column)
{
return self.Table.Columns.Contains(column)
? (T)self[column]
: default(T);
}
}
}
答案 4 :(得分:0)
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;
};
}
答案 5 :(得分:0)
要以Varun K的答案为基础,请使用通用类型参数:
public static T GetValue<T>(this DataRow row, string column)
{
if (!row.Table.Columns.Contains(column))
return default(T);
object value = row[ColumnName];
if (value == DBNull.Value)
return default(T);
return (T)value;
}