23

私はこれを得た:

 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 つずつチェックする必要がありますか?

4

11 に答える 11

29

次の行に沿った簡単な方法:

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
{
}
于 2010-02-24T13:42:40.997 に答える
15

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

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これで、このコンテキストやその他のコンテキストでも使用できる便利なヘルパーがもう 1 つあります。これを拡張して、またはデータにそのようなプレースホルダーがあることがわかっている場合などを含めることができ"n/a"ます"TBD"

于 2015-07-31T16:31:34.483 に答える
8

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

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

  return true;

このアプローチはよりシンプルでクリーンに見えると思います。

于 2011-09-02T05:05:35.277 に答える
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;
}
于 2010-02-24T14:09:18.197 に答える
3

これを使用できます:

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
}

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

于 2010-02-24T13:44:09.730 に答える
1

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

于 2012-07-13T13:41:24.983 に答える
0

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

于 2010-02-24T13:40:25.883 に答える
0

おそらく、より良い解決策は、各行で自動的に 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();)
 }
于 2010-02-24T13:53:59.243 に答える
0

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

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);
    }
}
于 2011-05-06T03:33:53.470 に答える