2012-12-03 43 views
7

शामिल है, मैं सूची [MyObject] का उपयोग करके संपूर्ण ऑब्जेक्ट की बजाय किसी संपत्ति की तुलना करना चाहता हूं। इसलिए मैं IEquatable [MyObject] का उपयोग करता हूं लेकिन संकलक अभी भी स्ट्रिंग प्रॉपर्टी के बजाय MyObject चाहता है। क्यूं कर?हाउटो ओवरराइड सूची <T> में

यहाँ मैं क्या मिला है:

public class AnyClass 
{ 
    public List<AnyOtherClass> MyProperty { get; set; }   
    public string AnyProperty { get; set; } 

    public AnyClass(string[] Names, string[] Values, string AnyProperty) 
    { 
     this.AnyProperty = AnyProperty; 
     this.MyProperty = new List<AnyOtherClass>(); 
     for (int i = 0; i < Names.Length; i++) 
      MyProperty.Add(new AnyOtherClass(Names[i], Values[i])); 
    } 
} 

public class AnyOtherClass : IEquatable<string> 
{ 
    public AnyOtherClass(string Name, string Values) 
    { 
     this.Name = Name; 
     this.Values = Values.Split(';').ToList(); 
    } 

    public string Name { get; set; } 
    public List<string> Values { get; set; } 

    public bool Equals(string other) 
    { 
     return this.Name.Equals(other); 
    } 
} 

    private void DoSomething() 
    { 
     string[] Names = new string[] { "Name1", "Name2" }; 
     string[] Values = new string[] { "Value1_1;Value1_2", "Value2" }; 
     AnyClass ac = new AnyClass(Names, Values, "any Property"); 

     if (ac.MyProperty.Contains("Name1")) //Problem is here... 
      //do something 
    } 

उत्तर

19

आप इस का उपयोग कर की कोशिश करना चाहते हो सकता है:

myList.Any(x => x.someProperty == someValue); 
MSDN से

: http://msdn.microsoft.com/en-us/library/bb534972.aspx

निर्धारित करता है एक दृश्य के किसी भी तत्व एक शर्त को संतुष्ट करता है या नहीं।

x => x.someProperty == someValue एक lambda expression मामले में आप नहीं पता था कि कहा जाता है।

और ध्यान दें कि आप IEnumerable को लागू करने वाले किसी भी चीज़ पर इसका उपयोग कर सकते हैं, जिससे यह आपको List<T> तक सीमित नहीं करता है।

+2

मैं बस इसे पोस्ट करने वाला था। पहला मैच मिलने पर 'कोई भी' मूल्यांकन बंद कर देगा, जबकि 'कहां' पूरी सूची प्राप्त करने जा रहा है (और संभावित रूप से चलाने में काफी समय लगता है)। –

+0

ठीक है मैं यहां LINQ का उपयोग करने के लिए नेतृत्व करूंगा। – UNeverNo

4

लगता है कि आप एक Contains

string value = "test"; 
ac.Where(ac => ac.Name1 == value || ac.Name2 == value); 

कारण ac.MyProperty.Contains("Name1") ऊपर बह रही है की तुलना में एक Where करना चाहिए बल्कि जाता है क्योंकि MyProperty एक है List<AnyOtherClass> और string

+0

हां, LINQ यहां काम करता है, लेकिन मुझे अभी भी समझ में नहीं आता है कि क्यों Iquatable काम नहीं कर रहा है। – UNeverNo

+0

+1 सिर्फ इसलिए कि * लगता है जैसे आपको एक ऐसा करना चाहिए जहां एक वाक्य के बजाय * वाक्य ने मुझे बहुत मदद की! – Izzy

2

यह IEquatable<AnyOtherClass><string> नहीं होना चाहिए। के उदाहरणों की तुलना में आप AnyOtherClass के उदाहरणों की तुलना कर रहे हैं, इस तथ्य के बावजूद कि आपकी तुलना वास्तव में आपकी कक्षा के भीतर तारों की तुलना कर रही है।

लेकिन ऐसा लगता है कि आप जो कुछ करने की कोशिश कर रहे हैं वह कुछ प्रकार का शब्दकोश है। इस मामले में आपको शब्दकोश कक्षाओं का उपयोग करना चाहिए।

+0

लेकिन मैं अपनी कक्षा की एक संपत्ति के लिए एक स्ट्रिंग की तुलना करना चाहता हूं। मेरे पास तुलना करने के लिए पूरी वस्तु नहीं है। – UNeverNo

+0

@UNeverNo: यह नहीं है कि 'IEquatable' इंटरफ़ेस क्या है। यह * समान * प्रकार की वस्तुओं की तुलना करने के लिए है। जैसा कि मैंने पहले कहा था, जो वास्तव में लगता है जैसे आप खोज रहे हैं वह 'सूची ' लेकिन एक 'शब्दकोश <स्ट्रिंग, AnyOtherClass>' नहीं है। –

2

यह IEquatable < टी > का इच्छित उपयोग नहीं है। प्रलेखन http://msdn.microsoft.com/en-us/library/ms131187.aspx को देखो: Implementers को

नोट्स प्रकार है कि इस इंटरफेस लागू कर रहा है के साथ IEquatable < टी > अंतरफलक के प्रकार पैरामीटर बदलें।

इसके अलावा काम करने के लिए डिज़ाइन किए जाने के अलावा, आप कक्षा में बराबर के कार्यान्वयन को क्यों मजबूर करेंगे क्योंकि एक अलग वर्ग के उदाहरण देखने के बारे में एक विशिष्ट आवश्यकता है? इसे अन्य उत्तरों में वर्णित कुंजी-आधारित लुकअप करने के लिए संग्रह को धारण करने वाले वर्ग तक छोड़ दें।