2011-11-29 7 views
10

मैं है दो सूचियों नीचे देखें ..... परिणाम वापस के रूप में खालीइंटरसेक्ट दोनों के बीच सूचियों काम नहीं कर रहा

List<Pay>olist = new List<Pay>(); 
List<Pay> nlist = new List<Pay>(); 
Pay oldpay = new Pay() 
{ 
    EventId = 1, 
    Number = 123,       
    Amount = 1 
}; 

olist.Add(oldpay); 
Pay newpay = new Pay() 
{ 
    EventId = 1, 
    Number = 123,       
    Amount = 100 
}; 
nlist.Add(newpay); 
var Result = nlist.Intersect(olist); 

किसी भी सुराग क्यों आ रहा है?

+0

मान इक्विटी मानना ​​इवेंट आईडी, संख्या, और राशि है, उन दो सूचियों में कुछ भी सामान्य नहीं है और इसलिए कुछ भी छेड़छाड़ नहीं करता है। दूसरे शब्दों में, आपने यहां समानता परिभाषित नहीं की है। –

+0

आपका मतलब क्या समानता परिभाषित नहीं किया गया है? केवल अलग तत्व राशि = 100 – user570715

+0

इस सवाल में कुछ भी नहीं है कि _why_ 'oldpay' को 'newpay' के बराबर होना चाहिए। –

उत्तर

21

आप जब 2 उदाहरणों बराबर माना जाता है अन्यथा Intersect पता नहीं है अपने Pay कक्षा में Equals और GetHashCode तरीकों ओवरराइड करने के लिए की जरूरत है,। यह अनुमान कैसे लगा सकता है कि यह EventId है जो समानता निर्धारित करता है? तो डिफ़ॉल्ट रूप से वे बराबर माना नहीं कर रहे हैं oldPay और newPay, अलग-अलग विविधताएं हैं।

आप इस तरह Pay में तरीकों को ओवरराइड कर सकते हैं:

public class PayComparer : IEqualityComparer<Pay> 
{ 
    public bool Equals(Pay x, Pay y) 
    { 
     if (x == y) // same instance or both null 
      return true; 
     if (x == null || y == null) // either one is null but not both 
      return false; 

     return x.EventId == y.EventId; 
    } 


    public int GetHashCode(Pay pay) 
    { 
     return pay != null ? pay.EventId : 0; 
    } 
} 

... 

var Result = nlist.Intersect(olist, new PayComparer()); 
+2

या आप अपना खुद का तुलनाकर्ता लिख ​​सकते हैं: http://msdn.microsoft.com/en-us/library/234b841s.aspx – mydogisbox

+0

@mydogisbox, हाँ, जब आप टिप्पणी करते थे तो मैं इसका उल्लेख करने के लिए वास्तव में अपना उत्तर संपादित कर रहा था;) –

+0

या आप 'पे' को आपके लिए यह करने के लिए 'स्ट्रक्चर' टाइप कर सकते हैं, हालांकि डिफ़ॉल्ट कार्यान्वयन धीमा है क्योंकि यह प्रतिबिंब का उपयोग करता है। – Gebb

0

Intersect शायद ही जोड़ने वस्तुओं है:

public override int GetHashCode() 
{ 
    return this.EventId; 
} 

public override bool Equals(object other) 
{ 
    if (other is Pay) 
     return ((Pay)other).EventId == this.EventId; 
    return false; 
} 

एक अन्य विकल्प एक IEqualityComparer<Pay> को लागू करने और Intersect के लिए एक पैरामीटर के रूप में यह पारित करने के लिए है Pay का एक ही उदाहरण दोनों List में है जब। के रूप में oldPay और newPay अलग instantiated कर रहे हैं वे बराबर नहीं माना रहे हैं।

Intersect वस्तुओं की तुलना करने के लिए Equals विधि का उपयोग करता। आप इसे ओवरराइड नहीं है, तो यह Object वर्ग के समान व्यवहार रखता है: true लौटने पर ही वस्तु का एक ही उदाहरण हैं।

आप Pay में Equals विधि ओवरराइड करना चाहिए।

//in the Pay class 
    public override bool Equals(Object o) { 
     Pay pay = o as Pay; 
     if (pay == null) return false; 
     // you haven't said if Number should be included in the comparation 
     return EventId == pay.EventId; // && Number == pay.Number; (if applies) 
    } 
0

ऑब्जेक्ट संदर्भ प्रकार हैं। जब आप दो ऑब्जेक्ट्स बनाते हैं, तो आपके पास दो अद्वितीय संदर्भ होते हैं। एक ही तरीका है वे कभी भी बराबर की तुलना होता है अगर आप ने क्या किया:

object a = new object(); 
object b = a; 

इस मामले में, (एक == ख) सच है। reference बनाम value प्रकार के बारे में पढ़ें, और objects

और आपकी समस्या का समाधान करने के लिए, ओवरराइड बराबर और GetHashCode, के रूप में थॉमस लेवेस्क ने बताया।

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