मेरे पास दो डेटाटेबल्स हैं जिनमें समान संरचना है। लेकिन उनमें डेटा अलग हो सकता है।

मुझे यह जांचने का एक त्वरित तरीका चाहिए कि डेटा समान है या अलग है। मुझे यह जानने की आवश्यकता नहीं है कि उनमें से एक "नया" डेटाटेबल है, और दूसरा "पुराना" है। यदि मतभेद हैं तो उपयोगकर्ता को यह तय करना होगा कि उसे नया चाहिए या पुराना।

उनकी तुलना करने का एक अच्छा तरीका क्या है?

मैं केवल सेल द्वारा सेल की जांच करना और उनकी तुलना करना जानता हूं लेकिन इसे करने का एक तेज़ और स्मार्ट तरीका होना चाहिए।

1
sharkyenergy 2 पद 2020, 13:44

2 जवाब

सबसे बढ़िया उत्तर

बेशक आपको हर सेल की जांच करनी होगी, लेकिन आप DataRowComparer.Equals:

Public Shared Function AreTablesEqual(t1 As DataTable, t2 As DataTable) As Boolean
    If t1 Is Nothing AndAlso t2 Is Nothing Then Return True
    If t1 Is Nothing OrElse t2 Is Nothing Then Return False
    If t1.Columns.Count <> t2.Columns.Count Then Return False
    If t1.Rows.Count <> t2.Rows.Count Then Return False

    For i As Int32 = 0 To t1.Rows.Count - 1
        If Not DataRowComparer.Default.Equals(t1.Rows(i), t2.Rows(i)) Then Return False
    Next

    Return True
End Function

अगर कोई सी # संस्करण की खोज करता है:

public static bool AreTablesEqual(DataTable t1, DataTable t2)
{
    if (t1 == null && t2 == null) return true;
    if (t1 == null || t2 == null) return false;
    if (t1.Columns.Count != t2.Columns.Count || t1.Rows.Count != t2.Rows.Count) return false;

    for (int i = 0; i < t1.Rows.Count; i++)
    {
        if (!DataRowComparer.Default.Equals(t1.Rows[i], t2.Rows[i])) return false;
    }

    return true;
}
4
Tim Schmelter 2 पद 2020, 14:28

यदि आप दो तालिकाओं को DataRows के दो सेट के रूप में देखते हैं (जहाँ स्वीकृत उत्तर के विपरीत ऑर्डर कोई मायने नहीं रखता), तो आप Enumerable. सिवाय विधि system.data.datarowcomparer.default" rel="nofollow noreferrer">DataRowComparer.Default अलग-अलग डेटा पंक्तियों को निर्धारित करने के लिए समानता तुलनाकर्ता के रूप में। फिर Enumerable.Any Method का उपयोग करें। निर्धारित करें कि क्या कोई अंतर पाया गया है।

Private Shared Function TableRowsAreTheSame(table1 As DataTable, table2 As DataTable) As Boolean
  Dim bothNull As Boolean = table1 Is Nothing AndAlso table2 Is Nothing
  Dim bothNotNull As Boolean = table1 IsNot Nothing AndAlso table2 IsNot Nothing


  Dim equalColumnAndRowCounts As Func(Of Boolean) = Function() (table1.Rows.Count = table2.Rows.Count) AndAlso (table1.Columns.Count = table2.Columns.Count)
  Dim equalFieldTypes As Func(Of Boolean) = Function()
                                              Dim typeAreEqual As Boolean
                                              For index As Int32 = 0 To table1.Columns.Count - 1
                                                typeAreEqual = table1.Columns(index).DataType.Equals(table2.Columns(index).DataType)
                                                If Not typeAreEqual Then Exit For
                                              Next
                                              Return typeAreEqual
                                            End Function


  Dim equalFieldValues As Func(Of Boolean) = Function()
                                                ' get rows in table1 that are Not in table2
                                                Dim differringRows As IEnumerable(Of DataRow) = Enumerable.Except(table1?.AsEnumerable(), table2?.AsEnumerable(), DataRowComparer.Default)
                                                Return (Not differringRows.Any)
                                              End Function



  Return bothNull OrElse
      (bothNotNull AndAlso equalColumnAndRowCounts() AndAlso equalFieldTypes() AndAlso equalFieldValues())


End Function
0
TnTinMn 4 पद 2020, 03:27