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