2014-09-20 107 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- (0).Rows(i)(0).ToString = ds.Tables(0).Rows(j)(01)'等於'1900-01-01'所以它返回true – Sathish 2014-09-20 09:27:47

+0

嘗試'DsMaxDates1.Tables 0).ToS tring和DsMaxDates1.Tables(0).Rows(i)(1).ToString = ds.Tables(0).Rows(j)(1).ToString and DsMaxDates1.Tables(0).Rows(i)(2) .ToString = ds.Tables(2).Rows(j)(0).ToString' – 2014-09-20 10:24:44

回答

2

你應該從來沒有改變你的數據的類型,除非它是絕對必要的。處理日期爲Date,整數爲Integer,字符串爲String,小數爲Decimal等。當您要向用戶顯示數據時,主要使用ToString方法。

就這麼說,你沒有比較數據集,你正在比較數據表。

之所以返回True是因爲您只比較第一列。你需要比較所有的列。如果您的表不包含像字節數組這樣的複雜數據類型,那麼最簡單的方法是使用LINQEnumerable.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

嗨,它的工作......再次感謝你.. – 2014-09-22 06:41:40

相關問題