检查DataRow是否包含特定列的最佳做法

Kon*_*ten 48 c# dataset

目前,当我遍历DataRow实例时,我会这样做.

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

不久之后(即早点),我会让桌子丢失柱,便便会撞到粉丝.经过一些广泛的谷歌搜索(大约30秒)后,我发现了以下保护语法.

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

现在 - 这是最简单的语法吗?!真?我期待一个方法,如果它存在,则获取该字段,否则为null.或者直接在行上至少包含一个Contains方法.

我错过了什么吗?我将以这种方式在许多领域进行映射,因此代码看起来会非常难以理解......

Var*_*n K 89

您可以创建一个扩展方法以使其更清晰:

static class DataRowExtensions
{
    public static object GetValue(this DataRow row, string column)
    {
        return row.Table.Columns.Contains(column) ? row[column] : null;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在调用它如下:

foreach(DataRow row in table)
    return yield new Thingy { Name = row.GetValue("hazaa") };
Run Code Online (Sandbox Code Playgroud)


Hes*_*her 13

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

if (table.Columns.Contains("donkey"))
{
    foreach ...
}
Run Code Online (Sandbox Code Playgroud)


Seb*_*nes 13

我真的很喜欢@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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 例如,如果您尝试从不存在的列获取整数值,这可能会导致误导结果。该方法将返回 0,这可能会导致某人相信该列存在并且该字段包含有效值 0。 (2认同)

how*_*eng 8

要以 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;
}
Run Code Online (Sandbox Code Playgroud)