2009-06-16 13 views
5

मेरे पास देश का नाम है। इसमें सार्वजनिक सदस्य, 'देशनाम' और 'राज्य' हैं।सूची के लिए अनुक्रमिक कार्य करें

मैंने देशों की एक सूची घोषित की है।

अब मैं एक ऐसा फ़ंक्शन लिखना चाहता हूं जो एक नया 'देश' स्वीकार करता है और यह तय करता है कि क्या देश सूची में पहले से ही 'देश' है।

मैं

bool CheckCountry(Country c) 
{ 
    return CountryList.Exists(p => p.CountryName == c.Name 
           && p.States.SequenceEqual(c.States)); 
} 

मैं स्टेट्स राज्य अमेरिका के COUNTRYNAME संपत्ति का उपयोग कर की तुलना करना चाहते हैं, मैं इतना है कि SequenceEqual राज्यों के COUNTRYNAME के ​​आधार पर काम करता है मेरी समारोह को संशोधित करना चाहते की तरह एक समारोह लेखन की कोशिश की?

उत्तर

12

इसे कई सरल प्रश्नों में विभाजित करें, और फिर उन प्रश्नों को एक साथ वापस रखें। आइटम उस नाम से मेल खाने वाले एक दृश्य बनाकर

आइए शुरू:

var nameMatches = from item in itemList where item.Name == p.Name select item; 

हम पी के subitems में नामों के अनुक्रम के खिलाफ उन वस्तुओं की तुलना करने की जरूरत है। वह अनुक्रम क्या है?

var pnames = from subitem in p.SubItems select subitem.Name; 

अब आप nameMatches जहां नामों में से अनुक्रम से मेल खाता से सभी तत्वों को खोजना चाहते हैं: एक प्रश्न लिखें। आप नामों का अनुक्रम कैसे प्राप्त कर रहे हैं? ठीक है, हम कितना कि pnames साथ है, तो एक ही बात करते हैं देखा:

var matches = from item in nameMatches 
       let subitemNames = 
        (from subitem in item.SubItems select subitem.Name) 
       where pnames.SequenceEqual(subitemNames) 
       select item; 

और अब आप जानना चाहते हैं, वहाँ कोई भी मैच कर रहे हैं?

return matches.Any(); 

यह ठीक काम करना चाहिए। लेकिन अगर आप वास्तव में बफ बनना चाहते हैं तो आप पूरी चीज को एक बड़ी क्वेरी में लिख सकते हैं!

return (
    from item in itemList 
    let pnames = 
     (from psubitem in p.SubItems select psubitem.Name) 
    let subitemNames = 
     (from subitem in item.SubItems select subitem.Name) 
    where item.Name == p.Name 
    where pnames.SequenceEqual(subitemNames) 
    select item).Any(); 

और आप कर चुके हैं। बहुत आसान! बस याद रखें, इसे छोटे चरणों में विभाजित करें, प्रत्येक समस्या को व्यक्तिगत रूप से हल करें, और उसके बाद समाधान को छोटे परिणामों से बाहर रखें।

+2

मुझे वास्तव में आश्चर्य हुआ है कि यह पढ़ने के दौरान सी # -टेम पर किसी के द्वारा लिखा गया है या नहीं। बाहर निकलता है: एरिक लिपर्ट निश्चित रूप से सी # -टेम पर है! – usr

1

क्या आपने आइटम पर आईसीओएमपेयर लागू करने पर विचार किया है?

1

यदि मैं आपको सही ढंग से समझता हूं तो आप दो वस्तुओं की तुलना करने का एक तरीका चाहते हैं जिसमें आप पहले दो आइटमों का नाम जांचते हैं, फिर अनुक्रमिक रूप से प्रत्येक सबिटम के नाम की जांच करें। यहां आप जो चाहते हैं:

public override bool Equals(object obj) 
    { 
     return this.Name == (obj as Item).Name; 
    } 
    public override int GetHashCode() 
    { 
     return this.Name.GetHashCode(); 
    } 
    public bool Check(Item obj) 
    { 
     if (this.Name != obj.Name) 
      return false; 
     //if the lists arent of the same length then they 
     //obviously dont contain the same items, and besides 
     //there would be an exception on the next check 
     if (this.SubItems.Count != obj.SubItems.Count) 
      return false; 
     for (int i = 0; i < this.SubItems.Count; i++) 
      if (this.SubItems[i] != obj.SubItems[i]) 
       return false; 
     return true; 
    } 
संबंधित मुद्दे