我懂了:

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

有帮助吗?

解决方案

沿着线的简单方法:

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

其他提示

我创建一个扩展方法(天哪我希望的Java有这些)称为IsEmpty如下:

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

在这里其他的答案是正确的。我只觉得我的在它的简洁使用LINQ到对象借给简洁。顺便说一句,这是在与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"

我更喜欢托米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<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 版本作为练习:)

AFAIK,没有方法,这是否在框架中。即使有在框架是这样的支持,那就基本上可以做同样的事情。这将是看在DataRow中的每个细胞,看它是否是空的。

我没有这样的:

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

也许更好的解决方案是添加被自动设置为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();)
 }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top