2011-12-16 22 views
7

मेरे पास ऑब्जेक्ट्स की एक सूची है कि उनमें से कुछ में एक ही आईडी हैं, इसलिए मैं उन तत्वों को हटाना चाहता हूं जो डुप्लीकेट हैं।इकाई ढांचे में विशिष्ट

मैं कुछ इस तरह से करने की कोशिश की:

List<post> posts = postsFromDatabase.Distinct().ToList(); 

लेकिन यह काम नहीं करता है!

तो मैं क्रम में इस पद्धति का डुप्लिकेट से बचने के लिए लिखा है:

public List<Post> PostWithOutDuplicates(List<Post> posts) 
    { 
     List<Post> postWithOutInclude = new List<Post>(); 
     var noDupes = posts.Select(x => x.Id).Distinct(); 
     if (noDupes.Count() < posts.Count) 
     { 
      foreach (int idPost in noDupes) 
      { 
       postWithOutInclude.Add(posts.Where(x => x.Id == idPost).First()); 
      } 
      return postWithOutInclude; 
     } 
     else 
     { 
      return posts; 
     } 
    } 

कैसे प्रदर्शन में सुधार करने की कोई भी विचार ??

अग्रिम में Thanx।

+0

यह कैसे है कि आपके पास डुप्लिकेट आईडी हैं? यह पता लगाने के लिए एक बड़ी समस्या की तरह लगता है। – Mikeb

उत्तर

25

यह अच्छा और आसान है:

List<Post> posts = posts 
.GroupBy(x => x.Id) 
.Select(x => x.FirstOrDefault()) 

लेकिन अगर आप यह उचित तरीके से लिखना चाहते हैं, मैं तुम्हें सलाह देते हैं कि इसे इस तरह लिखने के लिए:

public class PostComparer : IEqualityComparer<Post> 
{ 
    #region IEqualityComparer<Post> Members 

    public bool Equals(Post x, Post y) 
    { 
     return x.Id.Equals(y.Id); 
    } 

    public int GetHashCode(Post obj) 
    { 
     return obj.Id.GetHashCode(); 
    } 

    #endregion 
} 

यह दे देंगे के रूप में जब आप अतिरिक्त तुलना की बात करते हैं तो आप अधिक स्वतंत्रता प्राप्त करते हैं। इस वर्ग को लिखकर आप इसे इस तरह उपयोग कर सकते हैं:

List<Post> posts = postsFromDatabase.Distinct(new PostComparer()).ToList(); 
+2

मुझे लगता है कि 'GetHashCode' में आपको' obj.Id.GetHashCode() 'का उपयोग करना चाहिए क्योंकि हैशकोड दो वस्तुओं के लिए समान होना चाहिए जो' समान 'विधि के अनुसार बराबर हैं (कम से कम एमएसडीएन यह कहता है)। – Slauma

+0

अच्छी तरह से देखा! Id.GetHashCode() होना चाहिए, आप सही हैं। यदि कोई दिलचस्पी लेता है: http://msdn.microsoft.com/en-us/library/ms132151.aspx –

+3

यह डेटा मेमोरी में होने पर इसे संभालेगा। अच्छा नही। ग्रुपबी-एक्सच का उपयोग करें: http://stackoverflow.com/questions/8560884/how-to-implement-iequalitycomparer-to-return-distinct-values ​​ –

1
प्रथम() के बजाय

, .FirstOrDefault कोशिश()

5

मुझे लगता है कि लिखने के अपने स्वयं के कस्टम comparer एक अच्छा तरीका है। , http://support.microsoft.com/kb/320727

कारण यह है कि अलग काम नहीं कर रहे अपनी विशिष्ट() कैसे अगर वहाँ बराबर हैं detemine करने के बारे में कोई जानकारी नहीं है कि इतने इसे प्रयोग है:

यहाँ MSDN में एक लेख है कि विषय बताते हैं बहुत अच्छी तरह से है यह निर्धारित करने के लिए संदर्भ यह एक ही "वस्तु" है। यह काम करने के लिए काम की तरह काम कर रहा है। क्वेरी में सभी वर्ग एक ही वस्तु नहीं हैं।

अपना खुद का तुलनाकर्ता लिखकर (यह आसान है) आप अलग-अलग बता सकते हैं() यह निर्धारित करने के लिए तुलना कैसे करें कि वे बराबर हैं या नहीं।

संपादित करें: यदि विच्छेदन का उपयोग नहीं करना कोई समस्या नहीं है और स्थिति खाली नहीं है, तो पियेटर जस्टिन का पहला जवाब यह सरल और प्रभावी है।

+0

यदि संभव हो तो मैं ग्रुपबी() का उपयोग करने का सुझाव दूंगा। –

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