C# DataRow 空值检查

24
我得到了这个:
 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的每个单元格是否为空?或者我应该使用foreach,逐个检查它们?
12个回答

29

一种类似于以下代码的简单方法:

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
{
}

1
实际上foreach循环内的条件应该更多。我刚测试了一下 :)类似这样: if (value != null) { if (value.ToString() != "") { return false; } } - Ash
@Swoosh,我猜这取决于你对“空”的定义是什么。我选择了“null”。=) - Rob
1
这并没有考虑到列的默认值,也没有考虑自增列 - 请参见我的答案。 - Joe
返回 dr == null || dr.ItemArray.All(x => string.IsNullOrEmpty(x.ToString())); - kassi

16

我创建了一个扩展方法(天啊,我希望Java也能有这些)叫做IsEmpty,代码如下:

public static bool IsEmpty(this DataRow row)
{
    return row == null || row.ItemArray.All(i => i is DBNull);
}
其他答案都是正确的。我只是觉得我的回答使用Linq to Objects简洁明了。顺便说一句,这在与Excel解析一起使用时非常有用,因为用户可能会在页面下方(成千上万行)添加一行而不考虑如何影响解析数据。
在同一个类中,我放置了其他一些我认为有用的辅助工具,比如解析器,这样如果字段包含应该是数字的文本,你就可以流畅地解析它。对于任何刚接触这个想法的人,这是一个小小的专业提示。(真的有这样的人吗?)
考虑到这一点,这里有一个增强版:
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"的占位符,您可以将其扩展到包括这些内容。


8

我更喜欢Tommy Carlier的方法,但是稍作修改。

foreach (DataColumn column in row.Table.Columns)
    if (!row.IsNull(column))
      return false;

  return true;

我认为这种方法看起来更简单和更干净。


5
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;
}

4

我知道这个问题已经有答案了,而且这是一个老问题,但是这里有一个扩展方法可以做到同样的效果:

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

3
你可以使用以下内容:
if(drEntity.ItemArray.Where(c => IsNotEmpty(c)).ToArray().Length == 0)
{
    // Row is empty
}

IsNotEmpty(cell)是您自己实现的函数,它会根据单元格中的数据类型检查数据是否为空或null。如果是简单字符串,可能会像这样:

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

然而,它基本上检查每个单元格是否为空,并告诉您该行中的所有单元格是否为空。


我不喜欢这种方法的唯一一点是,你实际上必须要“思考”才能确定代码的作用,而“if (IsDataRowEmpty(drEntity)) { } else { }”并将实现移入IsDataRowEmpty方法则更容易阅读。 - Rob

1

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

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

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

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

因此,您应该检查类似以下内容:

bool isDirty = false;
for (int i=0; i<table.Columns.Count; i++)
{
    if (table.Columns[i].Expression.Length > 0) continue;
    if (table.Columns[i].AutoIncrement) continue;
    if (row[i] != table.Columns[i].DefaultValue) isDirty = true;
}

我会把LINQ版本留作练习 :)


1
您可以使用
If(String.concat(Dr.itemArray).length>0)

或者

string.isnullorempty(String.concat(Dr.itemArray))

检查空或空白的数据行。

0
也许更好的解决方案是添加一个额外的列,每行自动设置为1。只要有一个不为空的元素,就将其更改为0。
然后
If(drEntitity.rows[i].coulmn[8] = 1)
{
   dtEntity.Rows.Add(drEntity);
}
 else
 {
   //don't add, will create a new one (drEntity = dtEntity.NewRow();)
 }

0
我是这样做的:
var listOfRows = new List<DataRow>();
foreach (var row in resultTable.Rows.Cast<DataRow>())
{
    var isEmpty = row.ItemArray.All(x => x == null || (x!= null && string.IsNullOrWhiteSpace(x.ToString())));
    if (!isEmpty)
    {
        listOfRows.Add(row);
    }
}

它应该检查是否为!isEmpty,然后将行添加到列表中。 - Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接