C# में IStructuralEquatable इंटरफेस
IStructuralEquatable इंटरफेस (System.Collections) स्ट्रक्चरल इक्वैलिटी (मान-आधारित समानता) की तुलना के लिए मेथड्स परिभाषित करता है। दो ऑब्जेक्ट्स स्ट्रक्चरल रूप से समान हैं यदि उनके संबंधित एलिमेंट्स समान हैं।
मेथड्स
| मेथड | विवरण |
|---|---|
Equals(object other, IEqualityComparer comparer) | निर्धारित करता है कि वर्तमान इंस्टेंस निर्दिष्ट ऑब्जेक्ट के बराबर है या नहीं, दिए गए कम्पैरर का उपयोग करके। |
GetHashCode(IEqualityComparer comparer) | दिए गए कम्पैरर का उपयोग करके हैश कोड लौटाता है। |
कौन इम्प्लीमेंट करता है?
- Array (सभी एरे)
- Generic Tuple क्लासेस:
Tuple<T1>,Tuple<T1,T2>,Tuple<T1,T2,T3>, आदि।
उदाहरण: Tuple तुलना
using System;
using System.Collections;
class Program {
static void Main() {
var tuple1 = Tuple.Create(26.3, double.NaN, 35.6);
var tuple2 = Tuple.Create(26.3, double.NaN, 35.6);
// डिफ़ॉल्ट इक्वैलिटी (रेफरेंस) -> false
Console.WriteLine($"Default Equals: {tuple1.Equals(tuple2)}");
// स्ट्रक्चरल इक्वैलिटी (मान-आधारित)
IStructuralEquatable structural = tuple1;
bool equal = structural.Equals(tuple2, EqualityComparer<object>.Default);
Console.WriteLine($"Structural Equals: {equal}"); // true
// NaN तुलना: डिफ़ॉल्ट कम्पैरर NaN == NaN को true मानता है
Console.WriteLine($"double.NaN == double.NaN: {double.NaN == double.NaN}"); // false
Console.WriteLine($"EqualityComparer.Default: {EqualityComparer<double>.Default.Equals(double.NaN, double.NaN)}"); // true
}
}
आउटपुट
Default Equals: False Structural Equals: True double.NaN == double.NaN: False EqualityComparer.Default: True
मुख्य बिंदु
EqualsमेंIEqualityComparerपास करके तुलना लॉजिक कस्टमाइज़ कर सकते हैं।- टपल्स और एरे के लिए बिल्ट-इन; अपनी क्लासेस के लिए मैन्युअली इम्प्लीमेंट करें।
- स्ट्रक्चरल इक्वैलिटी डीप तुलना है (नेस्टेड एलिमेंट्स की तुलना)।
IEqualityComparerके साथ केस-इनसेंसिटिव स्ट्रिंग तुलना, कस्टम टॉलरेंस (फ्लोट्स के लिए) आदि संभव।
कस्टम कम्पैरर उदाहरण
// फ्लोट तुलना टॉलरेंस के साथ
public class FloatToleranceComparer : IEqualityComparer<double> {
private readonly double _tolerance;
public FloatToleranceComparer(double tolerance) => _tolerance = tolerance;
public bool Equals(double x, double y) => Math.Abs(x - y) < _tolerance;
public int GetHashCode(double obj) => obj.GetHashCode();
}
// उपयोग
var t1 = Tuple.Create(1.0001, 2.0);
var t2 = Tuple.Create(1.0002, 2.0);
var structural = (IStructuralEquatable)t1;
bool eq = structural.Equals(t2, new FloatToleranceComparer(0.001)); // true