क्यों काम नहीं करता है मेरे पास पृष्ठ नामक एक ऑब्जेक्ट है, जिसे पी कहा जाता है जिसमें एसोसिएटेड एट्रिब्यूट्स नामक एक कस्टम प्रॉपर्टी है। अगर मैं निम्न कार्य करें:क्या कोई मुझे LINQ के अंतर को सही ढंग से समझा सकता है? मुझे समझ में नहीं आता कि यह
int numMatchingAttributes = p.AssociatedAttributes.Intersect(p.AssociatedAttributes).Distinct().Count();
numMatchingAttributes भले ही पी 6 AssociatedAttributes है 0 के बराबर समाप्त होता है। यह 6 के बराबर क्यों नहीं है?
AssociatedAttributes
प्रकार List<Attribute>
की है (Attribute
, मेरे अपने वर्ग है System.Attribute
नहीं) और Attribute
IComparable<Attribute>
लागू करता है, मैं, मैं इसे लागू IEquatable
नहीं था चाहिए?
public int CompareTo(Attribute other)
{
return Id.CompareTo(other.Id);
}
Id
प्रकार Guid
की है:
इस विशेषता में CompareTo
का कार्यान्वयन है।
पृष्ठ पर AssociatedAttributes संपत्ति है:
public List<Attribute> AssociatedAttributes
{
get
{
List<Attribute> list = new List<Attribute>();
using (
PredictiveRecommendor dbContext =
new PredictiveRecommendor()){
if (dbContext != null)
{
IQueryable<Attribute> query = from a in dbContext.PageAttributes
where a.Page.Id.Equals(this.Id)
select a.Attribute;
list = query.ToList();
}
}
return list;
}
}
(dbContext है एक Telerik OpenAccess संदर्भ)
अद्यतन:
: पेज में निम्न विधि है: यहाँ क्या काम कर समाप्त हो गया हैpublic int numberOfIntersectedAssociatedAttributes (Page other)
{
using (PredictiveRecommendor dbContext = new PredictiveRecommendor())
{
IQueryable<Attribute> thisAssocAttributes = from a in dbContext.PageAttributes
where a.Page.Id.Equals(this.Id)
select a.Attribute;
IQueryable<Attribute> otherAssocAttributes = from a in dbContext.PageAttributes
where a.Page.Id.Equals(other.Id)
select a.Attribute;
IQueryable<Attribute> interSection = thisAssocAttributes.Intersect(otherAssocAttributes);
return interSection.ToList().Count;
}
}
यह बदसूरत है, लेकिन यह काम करता है।
public class Page
{
public List<Attribute> AssociatedAttributes
{
get
{
return new List<Attribute>() {
new Attribute { Value = "a" },
new Attribute { Value = "b" },
new Attribute { Value = "c" },
};
}
}
}
यहाँ AssociatedAttributes
संपत्ति एक अलग सूची हर बार AssociatedAttributes
कहा जाता है लौटा रहा है:
हम्म, लेकिन मुझे पहले से मौजूद विशेषता वस्तुओं के वास्तविक संदर्भों की आवश्यकता है। मैं सिर्फ नए उत्पन्न नहीं कर सकता। यह छेड़छाड़ की गिनती पाने के उद्देश्य के लिए काम कर सकता है, लेकिन यह और भी काम नहीं करेगा कि वे नव निर्मित वस्तुओं हैं। मैंने परीक्षण के रूप में केवल पृष्ठ के छेड़छाड़ के रूप में यह देखने के लिए किया कि क्या मैं सही चीजों को कोड कर रहा हूं। – cray1
@ user1911333 मैं यह नहीं कह रहा हूं कि आपको यह करना चाहिए, मैं कह रहा हूं कि मुझे लगता है कि आप पहले से ही यह कर रहे हैं (या इसी तरह के प्रभाव के साथ कुछ) आपके मनाए गए व्यवहार के लिए एक स्पष्टीकरण के रूप में। यदि आपने [मेरे प्रश्न] का जवाब दिया है (http://stackoverflow.com/questions/18365587/can-someone-explain-linqs-intersect-properly-to-me-i-dont-understand-why-this#comment26965710_18365587) कैसे संपत्ति लागू की गई है, मुझे अनुमान लगाने की आवश्यकता नहीं हो सकती है। मैं आपका कोड नहीं कह रहा हूं * मुझे इस तरह दिखना चाहिए; वास्तव में यह शायद नहीं होना चाहिए। अगर ऐसा होता है, तो यह काफी ... असामान्य होगा। – Servy
अब जब आपने कार्यान्वयन जोड़ा है तो मैं ठोस रूप से कह सकता हूं कि आप वास्तव में गेटटर के भीतर नए ऑब्जेक्ट उदाहरण बना रहे हैं, और यह आपकी समस्या है। विकल्प 1 या 3 आपके लिए सबसे अच्छी शर्त है। एक ओआरएम ऑब्जेक्ट संभवतः उत्परिवर्तनीय है, और आमतौर पर 'समान' या 'गेटहाशकोड' विधियों को ओवरराइड करने की अपेक्षा नहीं की जाएगी। – Servy