f# - Subtracting Records from a Set using case-insensitive comparison -
मेरे पास रिकॉर्ड का एक सेट है:
टाइप व्यक्ति = {नाम: स्ट्रिंग आयु: int} पुराना लोग दें = सेट [{नाम = "डॉक्टर"; आयु = 1500}; {Name = "Yoda"; ऊपर की हार्डकोड उदाहरण के विपरीत, डेटा का सेट वास्तव में डेटा स्रोत से आता है (जिस पर मेरे पास बहुत कम नियंत्रण है)। अब मुझे किसी अन्य डेटा स्रोत से डेटा का एक समूह घटाना होगा। सामान्य तौर पर, डेटा इस दूसरे स्रोत में से मेल खाता है, लेकिन कभी कभी वहाँ captialization में एक फर्क है: <कोड> जाने peopleWhoAreConfusedAboutTheirAge = सेट [{नाम = "द चिकित्सक"; उम्र = 1500}]
जब मैं पहली बार से दूसरे सेट का घटाना करने का प्रयास करता हूं, तो यह विफल हो जाता है क्योंकि स्ट्रिंग तुलना केस संवेदनशील है:
<कोड> जाने peopleWhoKnowHowOldTheyAre = oldPeople - peopleWhoAreConfusedAboutTheirAge
<कोड> वैल peopleWhoKnowHowOldTheyAre: सेट करें & lt; व्यक्ति & gt; = सेट [{नाम = "डॉक्टर"; आयु = 1500;}; {Name = "Yoda"; नाम क्षेत्र लोग रिकॉर्ड के लिए कोई केस-असंवेदनशील तुलना करने का कोई तरीका है? आयु = 900;}]
?
यही मैंने अभी तक लागू किया है, हालांकि ऐसा करने का एक बेहतर तरीका हो सकता है ।
मेरे समाधान को बराबर
फ़ंक्शन को लोग
पर ओवरराइड करने के लिए किया गया था, ताकि केस-असंवेदनशील तुलना करने के लिए रिकॉर्ड किया जा सके। घटाएं सेट करें, यह निर्धारित करने के लिए कि क्या दो रिकॉर्ड एक दूसरे से मेल खाते हैं, समान
फ़ंक्शन का उपयोग करता है बराबर
को ओवरराइड करके, मुझे GetHashCode
ओवरराइड करने के लिए (चेतावनी और त्रुटि के माध्यम से) और IComparable
को लागू करने के लिए मजबूर किया गया था (साथ ही CustomEquality सेट करें
और CustomComparison
विशेषताएँ):
[& lt; कस्टम एक्वालिटी; सदस्य निजी this._internalId = this.Name.ToLower () + this.Age.ToString () के सदस्य के साथ इंटरफेस System.IComparable this.CompareTo obj = अन्य करते हैं; CustomComparison & gt] व्यक्ति = {: स्ट्रिंग उम्र पूर्णांक नाम}: टाइप व्यक्ति = डाउनकास्ट ओजज यह._इनरियलआईडी.कंपरेओ (अन्य। इनलाइन) इसे ओवरराइड करें। एक्लॉल्स (अन्य) = दूसरे के साथ मैच करें। : दूसरे व्यक्ति - & gt; System.String.Compare (this._internalId, other._internalId) = 0 | _ - & gt; गलत यह ओवरराइड है। GetHashCode () = this._internalId.GetHashCode ()
यह, हालांकि, चाल करना लगता है:
चलिए पुराना लोग = सेट करें [{नाम =" डॉक्टर "; आयु = 1500}; {Name = "Yoda"; आयु = 900}] चलो लोगों को दोहराएं, के बारे में थिअरज = सेट [{नाम = "द डॉक्टर"; उम्र = 1500}] जाने peopleWhoKnowHowOldTheyAre = oldPeople - peopleWhoAreConfusedAboutTheirAge
<कोड> वैल peopleWhoKnowHowOldTheyAre: सेट करें & lt; व्यक्ति & gt; = सेट [{name = "Yoda"; आयु = 900;}]
अगर आपको बेहतर समाधान (कम कोड शामिल) पता है, तो कृपया इस उत्तर पर टिप्पणी के बजाय पोस्ट करें। मैं खुशी से एक कम शब्दबोधक, अजीब समाधान स्वीकार करूँगा।
Comments
Post a Comment