web-dev-qa-db-ja.com

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つずつ確認する必要がありますか?

18
Ash

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

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

次のようにIsEmptyと呼ばれる拡張メソッドを作成しました(Javaこれらがあればいいのですが))。

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

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

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

11
Jack Pines

私はトミー・カーリエのアプローチを好みますが、少し変更があります。

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

  return true;

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

7
Thinhbk
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
Tommy Carlier

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

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
3
Icarus

これを使用できます:

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

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

2
Aaron

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

  • DataColumnDataColumn.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バージョンは演習として残しておきます:)

1
Joe

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

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

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

0
Will

より良い解決策は、各行で自動的に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();)
 }
0
Zyon