मैंने अपने जैसे विभिन्न प्रश्न पढ़े हैं लेकिन उनमें से कोई भी मेरे मुद्दे को संबोधित नहीं करता है।IEquatable <T> लागू करें जब टी IENumerable <T>
मैं इस तरह एक प्रकार है:
class MyObject<T> : IEquatable<MyObject<T>> { // no generic constraints
private readonly string otherProp;
private readonly T value;
public MyObject(string otherProp, T value)
{
this.otherProp = otherProp;
this.value = value;
}
public string OtherProp { get { return this.otherProp; } }
public T Value { get { return this.value; } }
// ...
public bool Equals(MyObject<T> other)
{
if (other == null)
{
return false;
}
return this.OtherProp.Equals(other.OtherProp) && this.Value.Equals(other.Value);
}
}
जब T
एक अदिश है MyObject<int>
समानता ठीक से काम करता है, लेकिन जब मैं की तरह कुछ परिभाषित MyObject<IEnumerable<int>>
समानता में विफल रहता है के रूप में।
कारण यह है कि जब टी IEnumerable<T>
है तो मुझे this.Value.SequenceEqual(other.Value)
पर कॉल करना चाहिए।
इस अंतर को संभालने के लिए Equals(MyObject<T>)
बहुत सारे प्रकार के चेक और प्रतिबिंब (मेरे लिए, एसओएलआईडी/एसआरपी का उल्लंघन करने के कारण) के साथ।
मुझे एमएसडीएन दिशानिर्देशों में यह विशिष्ट मामला नहीं मिला, इसलिए यदि किसी को पहले से ही इस समस्या का सामना करना पड़ा है; यह ज्ञान बहुत अच्छा होगा अगर यह ज्ञान साझा किया जा सके।
संपादित करें: वैकल्पिक
K.I.S.S. के लिए, मैं कुछ इसी तरह करने के लिए सोच रहा हूँ:
class MyObject<T> : IEquatable<MyObject<T>> {
private readonly IEnumerable<T> value;
// remainder omitted
}
इस तरह Equal
के कार्यान्वयन एक बहुत सरल हो जाएगा। और जब मुझे केवल एक मूल्य की आवश्यकता होती है तो मेरे पास 1 आइटम का संग्रह होता है। स्पष्ट रूप से टी एक संख्यात्मक नहीं होगा (लेकिन डेटा संरचना निजी है इसलिए कोई समस्या नहीं है)।
यदि आपके मामले में यह संभव है, तो आप एक सामान्य बाधा भी जोड़ सकते हैं, जहां टी: IEquatable '। –
Guillaume
@ गुइलाउम, मुझे इसका मूल्यांकन करना और इसके बारे में तर्क करना है ... – jay
संदर्भ के लिए मैं __Edit के तहत उत्तर में क्या जोड़ना चाहता हूं: वैकल्पिक__ मेरे असली समाधान के करीब था। मुझे लगता है कि 'IENumerable' का उपयोग न करने के लिए कोई वैध कारण नहीं है, जब अधिकांश मामलों में 'टी' का संग्रह केवल एक तत्व होगा या खाली हो जाएगा। यह मामला नहीं है, संग्रह अक्सर एक से कुछ तत्वों से होता है; तो मैं कहूंगा कि 'माइक्रोनिएबल ' टाइप पैरामीटर के माध्यम से वैकल्पिक रूप से पारित होने के बजाय 'मायऑब्जेक्ट ' की परिभाषा में _hard coded_ होना चाहिए (मैं 'MyObject > 'से बचने की बात कर रहा हूं और इसके लिए जाना वैकल्पिक)। –
jay