डिफ़ॉल्ट रूप से उपयोग करते समय डिस्टिंचल लाइन ऑपरेटर ऑपरेटर विधि का उपयोग करता है लेकिन आप IEqualityComparer<T>दो ऑब्जेक्ट्स कस्टम तर्क लागू करने GetHashCodeऔर Equalsविधि के बराबर होने पर निर्दिष्ट करने के लिए अपनी खुद की वस्तु का उपयोग कर सकते हैं । उसे याद रखो:
GetHashCodeभारी सीपीयू तुलना का उपयोग नहीं करना चाहिए (उदाहरण के लिए केवल कुछ स्पष्ट बुनियादी जांचों का उपयोग करें) और इसका उपयोग पहली बार राज्य के रूप में किया जाता है यदि दो वस्तुएं निश्चित रूप से भिन्न होती हैं (यदि अलग-अलग हैश कोड वापस आ जाते हैं) या संभावित रूप से समान (समान हैश कोड)। इस नवीनतम मामले में जब दो ऑब्जेक्ट में समान हैशकोड होता है, तो फ्रेमवर्क दिए गए ऑब्जेक्ट्स की समानता के बारे में अंतिम निर्णय के रूप में इक्वाल्स विधि का उपयोग करके जांच करेगा।
आपके पास MyTypeऔर एक MyTypeEqualityComparerकक्षा के बाद कोड का पालन करना सुनिश्चित न करें कि अनुक्रम अपने आदेश को बनाए रखता है:
var cmp = new MyTypeEqualityComparer();
var lst = new List<MyType>();
var q = lst.Distinct(cmp);
विज्ञान पुस्तकालय का अनुसरण करने के लिए, मैंने एक विशिष्ट पद्धति का उपयोग करते हुए वेक्टर 3 डी सेट को बनाए रखने के लिए एक विस्तार विधि लागू की DistinctKeepOrder:
प्रासंगिक कोड इस प्रकार है:
public class Vector3DWithOrder
{
public int Order { get; private set; }
public Vector3D Vector { get; private set; }
public Vector3DWithOrder(Vector3D v, int order)
{
Vector = v;
Order = order;
}
}
public class Vector3DWithOrderEqualityComparer : IEqualityComparer<Vector3DWithOrder>
{
Vector3DEqualityComparer cmp;
public Vector3DWithOrderEqualityComparer(Vector3DEqualityComparer _cmp)
{
cmp = _cmp;
}
public bool Equals(Vector3DWithOrder x, Vector3DWithOrder y)
{
return cmp.Equals(x.Vector, y.Vector);
}
public int GetHashCode(Vector3DWithOrder obj)
{
return cmp.GetHashCode(obj.Vector);
}
}
संक्षेप Vector3DWithOrderमें प्रकार और एक आदेश पूर्णांक Vector3DWithOrderEqualityComparerencapsulate , जबकि मूल प्रकार तुलनित्र encapsulate।
और यह व्यवस्था बनाए रखने के लिए सहायक विधि है
public static IEnumerable<Vector3D> DistinctKeepOrder(this IEnumerable<Vector3D> vectors, Vector3DEqualityComparer cmp)
{
var ocmp = new Vector3DWithOrderEqualityComparer(cmp);
return vectors
.Select((w, i) => new Vector3DWithOrder(w, i))
.Distinct(ocmp)
.OrderBy(w => w.Order)
.Select(w => w.Vector);
}
नोट : आगे के शोध एक अधिक सामान्य (इंटरफेस का उपयोग) और अनुकूलित तरीके (ऑब्जेक्ट को बिना एनकैप्सुलेट किए बिना) खोजने की अनुमति दे सकते हैं।