C#DataRow空检查

我懂了:

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的帮助程序(在一个名为DataRowHelpers的静态类中,我知道它具有创造性),如下所示:

 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()); } 

现在你有了另一个有用的帮助器, IsNullEquivalent ,它可以在这个上下文中使用,也可以用于任何其他帮助器。 如果你知道你的数据有这样的占位符,你可以扩展它以包括诸如"n/a""TBD"类的东西。

我更喜欢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; } 

我知道这已经回答了,这是一个老问题,但这是一个扩展方法来做同样的事情:

 public static class DataExtensions { public static bool AreAllCellsEmpty(this DataRow row) { var itemArray = row.ItemArray; if(itemArray==null) return true; return itemArray.All(x => string.IsNullOrWhiteSpace(x.ToString())); } } 

你这样使用它:

 if (dr.AreAllCellsEmpty()) // etc 

你可以用这个:

 if(drEntity.ItemArray.Where(c => IsNotEmpty(c)).ToArray().Length == 0) { // Row is empty } 

IsNotEmpty(cell)将是您自己的实现,根据单元格中的数据类型检查数据是空还是空。 如果它是一个简单的字符串,它可能最终看起来像这样:

 if(drEntity.ItemArray.Where(c => c != null && !c.Equals("")).ToArray().Length == 0) { // Row is empty } else { // Row is not empty } 

尽管如此,它基本上会检查每个单元格是否空白,并让您知道该行中的所有单元格是否为空。

DataTable.NewRow会将每个字段初始化为:

  • 每个DataColumn的默认值( DataColumn.DefaultValue

  • 除了自动增量列( DataColumn.AutoIncrement == true ),它将被初始化为下一个自动增量值。

  • 和表达式列( DataColumn.Expression.Length > 0 )也是一种特殊情况; 默认值取决于计算表达式的列的默认值。

所以你应该检查一下:

 bool isDirty = false; for (int i=0; i 0) continue; if (table.Columns[i].AutoIncrement) continue; if (row[i] != table.Columns[i].DefaultValue) isDirty = true; } 

我将把LINQ版本作为练习:)

AFAIK,没有方法可以在框架中执行此操作。 即使在框架中支持这样的东西,它基本上也会做同样的事情。 这将查看DataRow中的每个单元格以查看它是否为空。

我是这样做的:

 var listOfRows = new List(); foreach (var row in resultTable.Rows.Cast()) { var isEmpty = row.ItemArray.All(x => x == null || (x!= null && string.IsNullOrWhiteSpace(x.ToString()))); if (!isEmpty) { listOfRows.Add(row); } } 

也许更好的解决方案是添加一个额外的列,每列自动设置为1。 只要有一个非null的元素,就将其更改为0。

然后

 If(drEntitity.rows[i].coulmn[8] = 1) { dtEntity.Rows.Add(drEntity); } else { //don't add, will create a new one (drEntity = dtEntity.NewRow();) }