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