Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查DataRow是否包含特定列的最佳实践_C#_Dataset - Fatal编程技术网

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

C# 检查DataRow是否包含特定列的最佳实践,c#,dataset,C#,Dataset,目前,当我迭代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

目前,当我迭代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;
现在-这是最简单的语法吗?!真正地我希望有一个方法可以在字段存在时为我获取该字段,否则为null。或者至少在行上直接包含一个方法


我错过什么了吗?我将以这种方式映射许多字段,因此代码看起来非常不可读…

因为您的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") };

要基于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;
}
publicstatict GetValue(此数据行、字符串列)
{
如果(!row.Table.Columns.Contains(column))
返回默认值(T);
对象值=行[列名称];
if(value==DBNull.value)
返回默认值(T);
返回(T)值;
}

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

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

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);
    }
  }
}
静态类扩展
{
公共静态T Get(此数据行自身,字符串列)
{
返回self.Table.Columns.Contains(列)
?(T)自我[列]
:默认值(T);
}
}
}

这对于一个栏目来说很好,但正如op所说,最终会有很多栏目,所以如果你不知道哪些栏目可能存在,哪些不存在,你将如何管理它们?@Varun,我肯定不会保留固定的字符串。如果专栏
hazaa
不再存在,你会怎么做?@Heslacher这就是重点。我需要管理的是,专栏有时会出现,有时不会。我无法控制,但我仍然需要控制它。您的示例为单个列分叉,可以为多个列外推。但是,请注意,问题是除了您介绍的via表之外,是否还有用于检查的语法。这是一个很好的解决方案。不知道为什么它没有得到更多的支持+不管怎样,我还是给了你1英镑。哇!一个非常简洁的解决方案。非常感谢。不错!但是,在野外实现时,它还应该检查
是否为ok值。这实际上非常适合我的需要。(我不喜欢这个问题,但我不认为我能做得更好……)这个问题仍然有新的答案、投票和评论,这让我感到兴奋。自从它被问到(并被回答)已经整整7年了,我想知道用户怎么会在搜索中得到它。既然有人问起了,EF接手了,我想是和Dapper和nHybernate一起消除了它的相关性。你怎么会在上面留下胡茬?(另外,新角度为+1。)信用到期时应给予信用。但是你的答案是如此的进步,我选择重新接受它作为新的正确答案。我还冒昧地将它稍加修改,以适应它的一般性质,将名称改为更抽象的名称。我希望一切顺利。谢谢你澄清学分应该在哪里。此外,我非常感谢您冒昧地改进了这种方法。我相信这就是我的想法。获取代码的所有权,并尝试使每一步都更好。例如,如果您试图从不存在的列中获取整数值,则可能会导致误导结果。该方法将返回0,这可能会导致某人认为该列存在,并且该字段包含有效值0。
static class Extensions
{
  public static T Get<T>(this DataRow self, string column)
  {
    return self.Table.Columns.Contains(column)
      ? (T)self[column]
      : default(T);
    }
  }
}