C#DataRow空检查

时间:2010-02-24 13:38:45

标签: 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的每个单元格是否为空? 或者我应该预约,并逐一检查它们?

11 个答案:

答案 0 :(得分:25)

一种简单的方法:

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 :(得分:10)

我创建了一个帮助器(在我称之为@:keep的静态类中,我知道它具有创造性),名为DataRowHelpers,如下所示:

IsEmpty

这里的其他答案都是正确的。我只是觉得我简洁地使用了Linq to Objects。顺便说一下,这与Excel解析结合使用非常有用,因为用户可以在页面上排成一行(数千行)而不考虑它如何影响解析数据。

在同一个类中,我将任何其他我发现有用的帮助程序,如解析器,以便如果该字段包含您知道应该是数字的文本,则可以流畅地解析它。对于任何刚接触这个想法的人来说,这个小小(SO的任何人,真的吗?不!)

考虑到这一点,这是一个增强版本:

public static bool IsEmpty(this DataRow row)
{
    return row == null || row.ItemArray.All(i => i is DBNull);
}

现在你有另一个有用的助手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"之类的内容。

答案 2 :(得分:7)

我更喜欢Tommy Carlier的做法,但稍作改动。

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

  return true;

我认为这种方法看起来更简单明了。

答案 3 :(得分: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 :(得分:3)

我知道这已经得到了解答,这是一个古老的问题,但这是一种扩展方法:

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

答案 5 :(得分:2)

你可以用这个:

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
}

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

答案 6 :(得分:1)

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

  • 每个DataColumnDataColumn.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版本作为练习:)

答案 7 :(得分:0)

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

答案 8 :(得分:0)

也许更好的解决方案是添加一个额外的列,每列自动设置为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();)
 }

答案 9 :(得分: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);
    }
}

答案 10 :(得分:0)

要删除null和空条目,请尝试

  foreach (var column in drEntitity.Columns.Cast<DataColumn>().ToArray())
            {
                if (drEntitity.AsEnumerable().All(dr => dr.IsNull(column) | string.IsNullOrEmpty( dr[column].ToString())))
                    drEntitity.Columns.Remove(column);
            }