检查 DataRow 是否包含特定列的最佳实践

现在,当我在 DataRow实例上迭代时,我这样做。

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

早一点(也就是早一点) ,我就会让 桌子错过 蠢驴列,然后便便就会撞上风扇。经过大量的搜索(大约30秒) ,我发现了以下保护语法。

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

这是最简单的语法吗!真的吗?我期待一个方法,让我的字段,如果它存在或 无效否则。或者至少在 划船上直接使用 包含方法。

我遗漏了什么吗? 我将在许多领域映射这种方式,使代码看起来可怕的不可读..。

75942 次浏览

由于 DataTable 表总是具有相同的列(它们不会对任何行进行更改) ,因此只需检查一次列名。

if (table.Columns.Contains("donkey"))
{
foreach ...
}

您可以创建一个扩展方法来使其更简洁:

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

要构建 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;
}

有时可能存在列名,但行不包含该列的数据; 例如,在使用 ReadXML 填充 DataTable 之后。

一个简单、快速和安全的解决方案是使用类型检查:

if(row["columnname"].GetType() != typeof(System.DBNull)){
//DataRow contains "columname"
}else{
//a safe scope to set default cell data
}

我真的很喜欢@Varun K 所采取的方法,所以,作为一个出发点,我只是想提出我的意见,以防它对其他人有帮助。我只是改进了它,使它成为 一般,而不是仅仅使用 对象作为返回类型。

static class Extensions
{
public static T Get<T>(this DataRow self, string column)
{
return self.Table.Columns.Contains(column)
? (T)self[column]
: default(T);
}
}
}