题
我懂了:
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();)
}