C# DataRow 空检查

问题描述 投票:0回答:12

我得到了这个:

 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,并一一检查它们?

c# datarow
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
{
}

16
投票

我创建了一个名为

IsEmpty
的扩展方法(天哪,我希望 Java 有这些),如下所示:

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"
之类的内容。


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)
将是您自己的实现,根据单元格中数据的类型检查数据是否为空或空。如果它是一个简单的字符串,它最终可能看起来像这样:

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

不过,它本质上是检查每个单元格是否为空,并让您知道该行中的所有单元格是否为空。


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 版本作为练习:)


0
投票

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


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

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

0
投票

要删除空条目和空条目,请尝试此操作

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

0
投票

您可以使用 If(String.concat(Dr.itemArray).length>0) 或者 string.isnullorempty(String.concat(Dr.itemArray)) 检查空或空白数据行。

© www.soinside.com 2019 - 2024. All rights reserved.