16


5

C#DataRow Empty-check

私はこれを得た:

 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して、それらを1つずつ確認する必要がありますか?

10 Answer


24


以下に沿った簡単な方法:

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


9


次のように、「IsEmpty」というヘルパーを作成しました(私が知っている独創的な「DataRowHelpers」という静的クラスに)。

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

ここの他の答えは正しいです。 私は、Linq to Objectsを簡潔に使用していることで、私の簡潔さを感じました。 ところで、これは、ユーザーがページの行(数千行)をデータ解析にどのように影響するかに関係なく行に追加できるため、Excel解析と併用すると非常に便利です。

同じクラスに、パーサーなどの便利だと思った他のヘルパーを配置します。これにより、フィールドに数値であることがわかっているテキストが含まれている場合、流itに解析できるようになります。 アイデアに新しい人のためのマイナーなプロのヒント。 (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 "`のようなものを含めることができます。


7


Tommy Carlierのアプローチが好きですが、少し変更があります。

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

  return true;

このアプローチはもっとシンプルで明るいように思えます。


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


3


私はこれがすでに答えられており、古い質問であることを知っていますが、同じことをする拡張方法があります:

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


2


あなたはこれを使用することができます:

if(drEntity.ItemArray.Where(c => IsNotEmpty(c)).ToArray().Length == 0)
{
    // Row is empty
}

`IsNotEmpty(cell)`は、セル内のデータのタイプに基づいて、データがnullか空かをチェックする独自の実装になります。 単純な文字列の場合、次のようになります。

if(drEntity.ItemArray.Where(c => c != null && !c.Equals("")).ToArray().Length == 0)
{
    // Row is empty
}
else
{
    // Row is not empty
}

それでも、本質的に各セルの空をチェックし、行のすべてのセルが空かどうかを知らせます。


1


`DataTable.NewRow`は各フィールドを次のように初期化します:

  • DataColumn`のデフォルト値( DataColumn.DefaultValue`)

  • 自動インクリメント列を除く ( DataColumn.AutoIncrement == true)、次の自動インクリメント値に初期化されます。

  • 式列( DataColumn.Expression.Length> 0)も 特別なケース;デフォルト値は、式が計算される列のデフォルト値に依存します。

したがって、おそらく次のようなものをチェックする必要があります。

bool isDirty = false;
for (int i=0; i 0) continue;
    if (table.Columns[i].AutoIncrement) continue;
    if (row[i] != table.Columns[i].DefaultValue) isDirty = true;
}

LINQバージョンは演習として残しておきます:)


0


私の知る限り、フレームワークでこれを行う方法はありません。 フレームワークでこのようなもののサポートがあったとしても、本質的に同じことをしているでしょう。 そして、DataRowの各セルを見て、空かどうかを確認します。


0


より良い解決策は、各行で自動的に1に設定される列を追加することです。 nullでない要素が存在する場合はすぐに、0に変更します。

then

If(drEntitity.rows[i].coulmn[8] = 1)
{
   dtEntity.Rows.Add(drEntity);
}
 else
 {
   //don't add, will create a new one (drEntity = dtEntity.NewRow();)
 }


0


私はこのようにしました:

var listOfRows = new List();
foreach (var row in resultTable.Rows.Cast())
{
    var isEmpty = row.ItemArray.All(x => x == null || (x!= null && string.IsNullOrWhiteSpace(x.ToString())));
    if (!isEmpty)
    {
        listOfRows.Add(row);
    }
}