С# 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 каждой ячейкой пустой?
Или я должен предусмотреть и проверить их один за другим?
Ответы
Ответ 1
Простой метод по строкам:
bool AreAllColumnsEmpty(DataRow dr)
{
if (dr == null)
{
return true;
}
else
{
foreach(var value in dr.ItemArray)
{
if (value != null)
{
return false;
}
}
return true;
}
}
Должен дать вам то, что вам нужно, и сделать его "приятным" (как ничто, насколько мне известно, в Framework), вы можете его обернуть как метод расширения, а затем ваш результирующий код будет:
if (datarow.AreAllColumnsEmpty())
{
}
else
{
}
Ответ 2
Я создал метод расширения (черт возьми, я бы хотел, чтобы в Java они были) под названием IsEmpty
:
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"
если вы знаете, что ваши данные имеют такие заполнители.
Ответ 3
Я предпочитаю подход Томми Карлье, но с небольшим изменением.
foreach (DataColumn column in row.Table.Columns)
if (!row.IsNull(column))
return false;
return true;
Я полагаю, что этот подход выглядит более простым и ярким.
Ответ 4
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;
}
Ответ 5
Я знаю, что на это уже был дан ответ, и это старый вопрос, но здесь можно использовать метод расширения:
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
Ответ 6
Вы можете использовать это:
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
}
Тем не менее, он по существу проверяет каждую ячейку на пустоту и позволяет узнать, все ли в ячейке пустые.
Ответ 7
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 в качестве упражнения:)
Ответ 8
AFAIK, нет способа, который делает это в рамках. Даже если бы была поддержка чего-то вроде этого в рамках, это было бы по существу делать то же самое. И это будет смотреть на каждую ячейку в DataRow, чтобы увидеть, пуст ли он.
Ответ 9
Возможно, лучшим решением было бы добавить дополнительный столбец, который автоматически устанавливается в 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();)
}
Ответ 10
Я сделал это вот так:
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);
}
}