दोनों इंटरफेस सॉर्टिंग और तुलना के लिए उपयोग होते हैं, लेकिन उनकी भूमिका अलग है।
IComparable<T> - आंतरिक तुलना
- क्लास खुद को दूसरी क्लास के साथ तुलना करने योग्य बनाती है।
- "मैं अपनी तुलना दूसरों से कर सकता हूँ।"
CompareTo(T other)लागू करना आवश्यक।- डिफ़ॉल्ट सॉर्टिंग व्यवहार परिभाषित करता है।
public class Vehicle : IComparable{ public string Make { get; set; } public int Year { get; set; } public int CompareTo(Vehicle other) { if (other == null) return 1; return this.Make.CompareTo(other.Make); // Make के अनुसार सॉर्ट } } // उपयोग List vehicles = ...; vehicles.Sort(); // IComparable उपयोग करता है
IComparer<T> - बाहरी तुलना
- अलग क्लास जो दो ऑब्जेक्ट्स की तुलना करती है।
- "मैं दूसरों की तुलना कर सकता हूँ।"
- एकाधिक सॉर्टिंग रणनीतियाँ (आरोही/अवरोही, अलग फील्ड्स) सक्षम करती है।
Compare(T x, T y)लागू करना आवश्यक।
public class VehicleYearComparer : IComparer{ public int Compare(Vehicle x, Vehicle y) { if (x == null && y == null) return 0; if (x == null) return -1; if (y == null) return 1; return x.Year.CompareTo(y.Year); } } // उपयोग vehicles.Sort(new VehicleYearComparer()); // Year के अनुसार सॉर्ट vehicles.Sort(new VehicleYearComparer().Reverse()); // अवरोही
तुलना तालिका
| विशेषता | IComparable<T> | IComparer<T> |
|---|---|---|
| कहाँ परिभाषित | टाइप के अंदर | अलग क्लास में |
| उद्देश्य | डिफ़ॉल्ट सॉर्ट ऑर्डर | कस्टम/वैकल्पिक सॉर्ट ऑर्डर |
| मेथड | CompareTo(T) | Compare(T, T) |
| उपयोग | List.Sort() | List.Sort(IComparer) |
| रणनीतियाँ | एक | असीमित |
नोट
नॉन-जेनेरिक संस्करण (IComparable, IComparer) भी मौजूद हैं लेकिन जेनेरिक संस्करण टाइप-सेफ हैं और बॉक्सिंग से बचते हैं।