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

时间:2013-08-13 11:47:41

标签: c# dataset

目前,当我遍历 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 。或至少直接在上的包含方法。

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

6 个答案:

答案 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;
}