2009-10-21 16 views
6

मैं 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()

नहीं कहता है

उत्तर

5

तरह से काम करता है Distinct है:

मैं कुछ इस तरह की है। असल में यह GetHashCode विधि का उपयोग करता है। आपको जो चाहिए उसे करने के लिए आप GetHashCode लिख सकते हैं।

public int GetHashCode(DataRow obj) 
{ 
    var values = obj.ItemArray.Except(new object[] { obj[obj.Table.PrimaryKey[0].ColumnName] }); 
    int hash = 0; 
    foreach (var value in values) 
    { 
     hash = (hash * 397)^value.GetHashCode(); 
    } 
    return hash; 
} 

चूंकि आप अपने डेटा को बेहतर तरीके से जानते हैं, तो आप शायद हैश उत्पन्न करने के लिए एक बेहतर तरीके से आ सकते हैं।

+0

सिंक में आपके बराबर और हैश फ़ंक्शंस रखना हमेशा अच्छा विचार है, उदा। हैश कोड समान नहीं होने पर बराबर कभी वापस नहीं आना चाहिए। Btw। मेरा अनुमान है कि बराबर() अभी भी कॉल किया जाएगा जब GetHashCode() एक ही चीज़ लौटाता है (क्योंकि हैश टकरा सकता है), तो आप शायद धोखा दे सकते हैं और हमेशा एक डमी हैश वापस कर सकते हैं। लेकिन ऐसा मत करो। – HerdplattenToni

+3

यह सिर्फ "एक अच्छा विचार" नहीं है, यह एक अनुशंसित अभ्यास है। एमएसडीएन का कहना है कि समानता को ओवरराइड करने के लिए गेटहाशकोड को ओवरराइड करना चाहिए। " –

+0

क्यों बिल्कुल 397? प्राथमिक कुंजी का उपयोग करने के बारे में अगर यह एक आईएनटी है? – abatishchev

संबंधित मुद्दे