سؤال

كيف يمكنني التنفيذ IEqualityComparer<DataRow> لإزالة التكرارات صفوف من أ DataTable مع الهيكل التالي:

ID primary key, col_1, col_2, col_3, col_4

لا تعمل المقارن الافتراضي لأن كل صف يحتوي على مفتاح أساسي فريد من نوعه.

كيفية التنفيذ IEqualityComparer<DataRow> سيؤدي ذلك إلى تخطي المفتاح الأساسي ومقارنة البيانات التي بقيت فقط.

لدي شيء مثل هذا:

public class DataRowComparer : IEqualityComparer<DataRow>
{
 public bool Equals(DataRow x, DataRow y)
 {
  return
   x.ItemArray.Except(new object[] { x[x.Table.PrimaryKey[0].ColumnName] }) ==
   y.ItemArray.Except(new object[] { y[y.Table.PrimaryKey[0].ColumnName] });
 }

 public int GetHashCode(DataRow obj)
 {
  return obj.ToString().GetHashCode();
 }
}

و

public static DataTable RemoveDuplicates(this DataTable table)
{
  return
    (table.Rows.Count > 0) ?
  table.AsEnumerable().Distinct(new DataRowComparer()).CopyToDataTable() :
  table;
}

لكنه يدعو فقط GetHashCode() ولا يتصل Equals()

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

المحلول

هذا هو الطريق Distinct يعمل. intenally يستخدم GetHashCode طريقة. يمكنك كتابة GetHashCode لفعل ما تحتاجه. شيء مثل

public int GetHashCode(DataRow obj)
{
    var values = obj.ItemArray.Except(new object[] { obj[obj.Table.PrimaryKey[0].ColumnName] });
    int hash = 0;
    foreach (var value in values)
    {
        hash = (hash * 397) ^ value.GetHashCode();
    }
    return hash;
}

نظرًا لأنك تعرف بياناتك بشكل أفضل ، فربما يمكنك التوصل إلى طريقة أفضل لإنشاء التجزئة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top