سؤال

حصلت على هذا:

 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 فارغة؟ أو يجب أن أتفقدها ، والتحقق منها واحدة تلو الأخرى؟

هل كانت مفيدة؟

المحلول

طريقة بسيطة على غرار:

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

نصائح أخرى

لقد قمت بإنشاء طريقة تمديد (gosh أتمنى أن تسمى Java هذه) IsEmpty على النحو التالي:

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

الإجابات الأخرى هنا صحيحة. لقد شعرت للتو بإيجاز لينت في استخدامه المختصرة للأشياء. راجع للشغل ، هذا مفيد حقًا بالتزامن مع تحليل Excel نظرًا لأن المستخدمين قد يتخطون على الصفحة أسفل الصفحة (آلاف الخطوط) دون أي اعتبار لكيفية تأثير ذلك على تحليل البيانات.

في نفس الفصل ، وضعت أي مساعدين آخرين وجدته مفيدًا ، مثل المحللين ، بحيث إذا كان الحقل يحتوي على نص تعرفه يجب أن يكون رقمًا ، فيمكنك تحليله بطلاقة. نصيحة طفيفة للمحترفين لأي شخص جديد على الفكرة. (أي شخص في ذلك ، حقا؟ ناه!)

مع وضع ذلك في الاعتبار ، إليك نسخة محسّنة:

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" إذا كنت تعلم أن بياناتك لديها أصحاب نائبة من هذا القبيل.

أفضل نهج تومي كارلير ، ولكن مع القليل من التغيير.

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

  return true;

أفترض أن هذا النهج يبدو أكثر بساطة ومشرقة.

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

أعلم أن هذا قد تمت الإجابة عليه بالفعل وهو سؤال قديم ، ولكن إليك طريقة تمديد لفعل الشيء نفسه:

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

يمكنك استخدام هذا:

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
}

ومع ذلك ، فإنه يتحقق بشكل أساسي من كل خلية من أجل الفراغ ، ويتيح لك معرفة ما إذا كانت جميع الخلايا في الصف فارغة.

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 كتمرين :)

AFAIK ، لا توجد طريقة تقوم بذلك في الإطار. حتى لو كان هناك دعم لشيء مثل هذا في الإطار ، فإنه سيكون في الأساس نفس الشيء. وسيكون ذلك ينظر إلى كل خلية في dataRow لمعرفة ما إذا كانت فارغة.

لقد فعلت ذلك مثل هذا:

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

ربما يكون الحل الأفضل هو إضافة عمود إضافي يتم تعيينه تلقائيًا على 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();)
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top