我懂了:
DataTable dtEntity = CreateDataTable(); drEntity = dtEntity.NewRow();
然后我将数据添加到行(或不).很多代码,真的不知道行内是否有任何东西.取决于输入(我从一些文件导入).我想做点什么:
if (drEntity`s EVERY CELL IS NOT EMPTY) { dtEntity.Rows.Add(drEntity); } else { //don't add, will create a new one (drEntity = dtEntity.NewRow();) }
有没有一些很好的方法来检查DataRow的每个单元格是否为空?或者我应该预先,并逐一检查它们?
一种简单的方法:
bool AreAllColumnsEmpty(DataRow dr) { if (dr == null) { return true; } else { foreach(var value in dr.ItemArray) { if (value != null) { return false; } } return true; } }
应该给你你想要的东西,并使它"好"(因为在框架中没有任何我知道的东西),你可以把它作为一个扩展方法包装起来,然后你得到的代码就是:
if (datarow.AreAllColumnsEmpty()) { } else { }
我创建了一个帮助程序(在一个静态类中,我称之为IsEmpty
创造性,我知道)IsNullEquivalent
,如下所示:
public static bool IsEmpty(this DataRow row) { return row == null || row.ItemArray.All(i => i is DBNull); }
这里的其他答案都是正确的.我只是觉得我简洁地使用了Linq to Objects.顺便说一句,这与Excel解析结合使用非常有用,因为用户可能会在页面上的一行(数千行)处理,而不考虑它如何影响解析数据.
在同一个类中,我把任何其他我发现有用的帮助器,比如解析器,这样如果字段包含你知道的文本应该是一个数字,你可以流利地解析它.对于任何刚接触这个想法的人来说,这个小小 (SO的任何人,真的吗?不!)
考虑到这一点,这是一个增强版本:
public static bool IsEmpty(this DataRow row) { return row == null || row.ItemArray.All(i => i.IsNullEquivalent()); } public static bool IsNullEquivalent(this object value) { return value == null || value is DBNull || string.IsNullOrWhiteSpace(value.ToString()); }
现在你有另一个有用的帮助器,"n/a"
它可以在这个上下文中使用,也可以用于任何其他帮助器.您可以扩展它以包含类似的内容,"TBD"
或者IsEmpty
如果您知道您的数据具有类似的占位符.
我更喜欢Tommy Carlier的方法,但稍微改变一下.
foreach (DataColumn column in row.Table.Columns) if (!row.IsNull(column)) return false; return true;
我想这种方法看起来更简单明了.
public static bool AreAllCellsEmpty(DataRow row) { if (row == null) throw new ArgumentNullException("row"); for (int i = row.Table.Columns.Count - 1; i >= 0; i--) if (!row.IsNull(i)) return false; return true; }