मैं IEqualityComparer<DataRow>
को DataTable
से डुप्लिकेट पंक्तियों को हटाने के लिए IEqualityComparer<DataRow>
को कैसे कार्यान्वित कर सकता हूं:डेटाटेबल और कस्टम IEqualityComparer <DataRow> से डुप्लिकेट निकालें
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()
सिंक में आपके बराबर और हैश फ़ंक्शंस रखना हमेशा अच्छा विचार है, उदा। हैश कोड समान नहीं होने पर बराबर कभी वापस नहीं आना चाहिए। Btw। मेरा अनुमान है कि बराबर() अभी भी कॉल किया जाएगा जब GetHashCode() एक ही चीज़ लौटाता है (क्योंकि हैश टकरा सकता है), तो आप शायद धोखा दे सकते हैं और हमेशा एक डमी हैश वापस कर सकते हैं। लेकिन ऐसा मत करो। – HerdplattenToni
यह सिर्फ "एक अच्छा विचार" नहीं है, यह एक अनुशंसित अभ्यास है। एमएसडीएन का कहना है कि समानता को ओवरराइड करने के लिए गेटहाशकोड को ओवरराइड करना चाहिए। " –
क्यों बिल्कुल 397? प्राथमिक कुंजी का उपयोग करने के बारे में अगर यह एक आईएनटी है? – abatishchev