2013-08-21 2 views
0

Я прошел через резьб данных, но не был в состоянии найти реализацию для прохода в случае C# (веб-сайт MSDN не имеет DataTable/общий сбора утверждает, использование либо) ..Assert.AreEqual использования метода при проверке DataTable типов

код на клиенте не с нами (только 2 DataTables возвращаются к нам)

datarow dr1 = datatable1.newrow(); 
dr1[0] = 345; 

datarow dr2 = datatable1.newrow() 
dr2[0] = 345; 

datatable1.rows.add(dr1); //(1) 
datatable2.rows.add(dr2); //(2) 

код на нашем конце

Assert.AreEqual(dt1,dt2); //fails!!How to pass this case?? 
+0

И что именно это не так? Он должен сказать сообщение, является ли это разницей в значениях или пытается сравнить ссылки. – gunr2171

+0

Потому что оба разные ссылки –

ответ

1

Ваша версия AreEqual метод использует Assert.AreEqual(Object expected, Object actual). Это означает, что для сравнения будет использоваться Object.Equals().

Выполнить этот код и посмотреть, что значение:

bool areEqual = dr1.Equals(dr2); 

Это вернет ложь, потому что они не одни и те же ссылки. Посмотрите документацию для Object.Equals:

Если текущий экземпляр является ссылочным типом, то Equals (Object) метод испытание на равенство ссылок, и призыв к Равным методы (Object) эквивалентны вызовут к Метод ReferenceEquals. Ссылочное равенство означает, что сравниваемые переменные объекта относятся к одному и тому же объекту.

Вам необходимо найти более подходящий способ сравнения ваших данных. Вы можете использовать DataRowComparer для сравнения значений. Вы также можете прокручивать каждую из своих строк и сравнивать значения самостоятельно. См. Пример dotnetperls.

+0

Я знаю, что это очень старый вопрос. Но спасибо. Тогда это было доказано как решение. – vamsee

3

Assert.AreEqual будет использовать метод Equals на тип. DataTable не отменяет этот метод, поэтому это контрольная проверка. Это означает, что dt1 не равно dt2.

Вы можете использовать CollectionAssert, но это сделает сравнение с участниками. Опять же, DataRow не переопределяет Equals, поэтому он будет выполнять контрольную проверку.

Вам нужно будет написать пользовательскую логику сравнения, а затем сделать что-то вроде Assert.IsTrue(DataTableComparer.AreEqual(dt1, dt2));

+1

Вы имеете в виду ['DataRowComparer'] (http://msdn.microsoft.com/en-us/library/bb907955.aspx)? – gunr2171

+0

Нет, это было имя класса, которое я сделал на месте в этом примере. Я даже не знал, что существует «DataRowComparer». – cadrell0

0

AreEqual сравнивает по ссылке, если объект не отменяет «Равно» метод

Попробуйте ниже, вставленный из http://social.msdn.microsoft.com/Forums/vstudio/en-US/23703a85-20c7-4759-806a-fabf4e9f5be6/how-to-compare-two-datatables

Assert.IsTrue(ComareDataTables(DTable1,DTable2)); 

private bool CompareDataTables(DataTable DT1, DataTable DT2) 
    { 
     if ((DT1 == null) && (DT2 == null)) 
      return true; 
     else if ((DT1 != null) && (DT2 != null)) 
     { 
      if (DT1.Rows.Count == DT2.Rows.Count) 
      { 
       if (DT1.Columns.Count == DT2.Columns.Count) 
       { 
        for (int i = 0; i < DT1.Rows.Count; i++) 
        { 
         for(int j = 0; j<DT1.Columns.Count; j++) 
         { 
          if (DT1.Rows[i][j].ToString() != DT2.Rows[i][j].ToString()) 
           return false; 
         } 
        } 
        return true; 
       } 
       else 
        return false; 
      } 
      else 
       return false; 
     } 
     else 
      return false; 
    } 
+3

Вам не нужно 'else', если вы' возвращаете' в 'if'. Имея это в виду, я бы рекомендовал инвертировать ваши условия if, чтобы вы не были настолько глубоко вложены. – cadrell0

+3

Также вам не следует сравнивать строковые значения элементов.Я бы сначала сравнил типы столбцов, чтобы убедиться, что они одинаковые, и если они есть, используйте 'object.Equals' для сравнения отдельных ячеек. Это будет обрабатывать нулевые значения, быть быстрее и обрабатывать возможный случай двух разных объектов, имеющих одинаковое строковое представление (что на самом деле не абсурдно для концепции). – Servy

Смежные вопросы