23

我懂了:

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

4

11 回答 11

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
{
}
于 2010-02-24T13:42:40.997 回答
15

我创建了一个扩展方法(天哪,我希望 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"如果您知道您的数据有这样的占位符。

于 2015-07-31T16:31:34.483 回答
8

我更喜欢 Tommy Carlier 的方法,但有一点改变。

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

  return true;

我想这种方法看起来更简单、更干净。

于 2011-09-02T05:05:35.277 回答
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;
}
于 2010-02-24T14:09:18.197 回答
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
于 2013-06-06T16:05:17.400 回答
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
}

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

于 2010-02-24T13:44:09.730 回答
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 版本作为练习 :)

于 2012-07-13T13:41:24.983 回答
0

AFAIK,框架中没有方法可以做到这一点。即使框架中支持这样的东西,它本质上也会做同样的事情。这将查看 DataRow 中的每个单元格以查看它是否为空。

于 2010-02-24T13:40:25.883 回答
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();)
 }
于 2010-02-24T13:53:59.243 回答
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);
    }
}
于 2011-05-06T03:33:53.470 回答
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);
            }
于 2020-06-04T15:09:38.903 回答