2014-09-20 3 views
0

У меня есть два набора данных в моем коде. Мне нужно сравнить, что второй набор данных с первого набора данных Мои первые набор данных возвращает этот результат ниже: -Сравнение одного набора данных с другим набором данных в vb.net

FirstDs: -

MaxUpdatedPrepped  MaxUpdatedSent   MaxUpdatedStamped 

1900-01-01    1900-01-01    1900-01-01 

И второй набор данных возвращается ниже: -

SecondDS: -

MaxUpdatedPrepped  MaxUpdatedSent   MaxUpdatedStamped 

1900-01-01    1900-01-01    2014-11-11 

Мне нужно сравнить, что как результат, так и ответ на возврат, как «Не соответствует», если оба значения первого набора данных не соответствуют второму значению набора данных. Я много пробовал, но я мог получить только неправильный ответ

For i As Integer = 0 To DsMaxDates1.Tables(0).Rows.Count - 1 
    Dim found As Boolean = False 
    For j As Integer = 0 To ds.Tables(0).Rows.Count - 1 
     If DsMaxDates1.Tables(0).Rows(i)(0).ToString = ds.Tables(0).Rows(j)(0).ToString Then 
      found = True 
     End If 
    Next 
    If found = False Then 
     ASPNET_MsgBox("Another User Working in Same Account. Please Click Reset.") 
    End If 
Next 

Этот результат возвращает true вместо false.

+0

первое значение набора данных '1900- 01-01' равно '1900-01-01', поэтому его возвращение истинно – Sathish

+0

try' DsMaxDates1.Tables (0) .Rows (i) (0) .ToString = ds.Tables (0) .Rows (j) (0) .ToS tring и DsMaxDates1.Tables (0) .Rows (i) (1) .ToString = ds.Tables (0) .Rows (j) (1) .ToString и DsMaxDates1.Tables (0) .Rows (i) (2) .ToString = ds.Tables (2) .Rows (j) (0). ToString' –

ответ

2

Вы должны никогда изменить тип данных, если только это абсолютно необходимо. Лечить даты как Date, целые числа как Integer, строки как String, десятичные знаки как Decimal и т. Д. Метод ToString в основном используется, когда вы хотите отображать данные пользователю.

С учетом сказанного вы не сравниваете данные, вы сравниваете данные.

Причина в том, почему он возвращает True, потому что вы сравниваете только первый столбец. Вам нужно сравнить все столбцы. Если ваша таблица не содержит сложных типов данных, таких как массивы байтов, самым простым способом является использование LINQ в сочетании с Enumerable.SequenceEqual.

В следующем коде предполагается, что каждая таблица содержит одинаковое количество строк и столбцов.

''Uncomment to unleash the one-liner: 
'Dim notEqual As Boolean = (From i As Integer In Enumerable.Range(0, DsMaxDates1.Tables(0).Rows.Count) Where (Not DsMaxDates1.Tables(0).Rows(i).ItemArray.SequenceEqual(ds.Tables(0).Rows(i).ItemArray)) Select True).FirstOrDefault() 

Dim notEqual As Boolean = (
    From i As Integer In Enumerable.Range(0, DsMaxDates1.Tables(0).Rows.Count) 
    Where (Not DsMaxDates1.Tables(0).Rows(i).ItemArray.SequenceEqual(ds.Tables(0).Rows(i).ItemArray)) 
    Select True 
).FirstOrDefault() 

If (notEqual) Then 
    ASPNET_MsgBox("Another User Working in Same Account. Please Click Reset.") 
End If 

Вы можете расширить еще дальше, создав многоразовый метод расширения:

Public Module Extensions 

    <System.Runtime.CompilerServices.Extension()> 
    Public Function SequenceEqual(table1 As DataTable, table2 As DataTable) As Boolean 
     Return (((((Not table1 Is Nothing) AndAlso (Not table2 Is Nothing))) AndAlso ((table1.Rows.Count = table2.Rows.Count) AndAlso (table1.Columns.Count = table2.Columns.Count))) AndAlso ((table1.Rows.Count = 0) OrElse (Not (From i As Integer In Enumerable.Range(0, table1.Rows.Count) Where (Not table1.Rows(i).ItemArray.SequenceEqual(table2.Rows(i).ItemArray)) Select True).FirstOrDefault()))) 
    End Function 

End Module 

Тогда вы можете просто сделать следующее:

If (Not DsMaxDates1.Tables(0).SequenceEqual(ds.Tables(0))) Then 
    ASPNET_MsgBox("Another User Working in Same Account. Please Click Reset.") 
End If 
+1

Привет, его работа ... Еще раз спасибо .. –

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