2008-09-11 12 views
8

मुझे एक फंक्शन मिला जो Collection<string> देता है, और अंततः एक बड़े Collection<string> को वापस करने के लिए स्वयं को कॉल करता है।दो संग्रह विलय <T>

अब, मुझे आश्चर्य है कि सूचियों को मर्ज करने का सबसे अच्छा तरीका क्या है? Collection.CopyTo() स्ट्रिंग [] के लिए केवल प्रतियां, और foreach() लूप का उपयोग अक्षम होने की तरह लगता है। हालांकि, चूंकि मैं डुप्लिकेट को फ़िल्टर करना भी चाहता हूं, मुझे लगता है कि मैं पर Contains() पर कॉल करता हूं।

मुझे आश्चर्य है, क्या एक रिकर्सिव फ़ंक्शन रखने का एक और अधिक प्रभावी तरीका है जो डुप्लीकेट के बिना तारों की सूची देता है? मुझे Collection का उपयोग करने की आवश्यकता नहीं है, यह बहुत उपयुक्त डेटा प्रकार हो सकता है।

केवल बहिष्करण, मैं विजुअल स्टूडियो 2005 और .NET 3.0 से जुड़ा हूं, इसलिए कोई LINQ नहीं है।

संपादित करें: स्पष्टीकरण के लिए: फ़ंक्शन उपयोगकर्ता को सक्रिय निर्देशिका से बाहर ले जाता है, उपयोगकर्ता की डायरेक्ट रिपोर्ट देखता है, और फिर प्रत्येक उपयोगकर्ता की प्रत्यक्ष रिपोर्ट को फिर से देखता है। तो अंतिम परिणाम किसी दिए गए उपयोगकर्ता की "कमांड चेन" में मौजूद सभी उपयोगकर्ताओं की एक सूची है। चूंकि इसे अक्सर निष्पादित किया जाता है और इस समय कुछ उपयोगकर्ताओं के लिए 20 सेकेंड लगते हैं, मैं इसे सुधारने के तरीकों की तलाश में हूं। 24 घंटे के परिणाम का कैशिंग मेरी सूची बीटीडब्ल्यू पर भी है, लेकिन मैं देखना चाहता हूं कि कैशिंग लगाने से पहले इसे कैसे सुधारें।

उत्तर

16

यदि आप सूची < का उपयोग कर रहे हैं> तो आप अन्य सूची में एक सूची जोड़ने के लिए उपयोग कर सकते हैं।

या आप इस तरह मक्खी पर सूचियां संयोजित करने की उपज वापसी का उपयोग कर सकते हैं:

public IEnumerable<string> Combine(IEnumerable<string> col1, IEnumerable<string> col2) 
{ 
    foreach(string item in col1) 
     yield return item; 

    foreach(string item in col2) 
     yield return item; 
} 
1

मुझे लगता है कि HashSet<T> एक बड़ी मदद है।

HashSet<T> वर्ग उच्च प्रदर्शन सेट आपरेशन प्रदान करता है। एक सेट एक संग्रह है जिसमें डुप्लिकेट तत्व नहीं हैं, और जिनके तत्व किसी विशेष क्रम में नहीं हैं।

बस इसमें आइटम जोड़ें और फिर CopyTo का उपयोग करें।


अद्यतन: HashSet<T> शायद तुम Dictionary<TKey, TValue> उपयोग कर सकते हैं नेट 3.5

में है। एक शब्दकोश में डुप्लिकेट कुंजी सेट अप अपवाद नहीं उठाएगा।

1

आप Iesi.Collections और Extended Generic Iesi.Collections पर एक नज़र लेने के लिए चाहते हो सकता है (क्योंकि पहले संस्करण 1.1 में बनाया गया था जब वहाँ थे कोई जेनेरिक अभी तक)।

विस्तारित आईसीआई में एक आईएसटी कक्षा है जो वास्तव में हैशसेट के रूप में कार्य करती है: यह अद्वितीय सदस्यों को लागू करती है और डुप्लिकेट की अनुमति नहीं देती है।

Iesi के बारे में गंधा बात यह संग्रह मर्ज करने के लिए तरीकों के बजाय ऑपरेटरों की स्थापना की है कि है, तो आप एक संघ के बीच विकल्प नहीं है (|), चौराहे (&), XOR (^) और इसके आगे।

1

क्या आप संग्रह में अपने तरीके को संग्रहित कर सकते हैं ताकि आप इसे केवल आइटम जोड़ सकें, इस तरह आपको कुछ भी वापस नहीं करना पड़ेगा। यह ऐसा लगता है जैसे आपने इसे सी # में किया था।

class Program 
{ 
    static void Main(string[] args) 
    { 
     Collection<string> myitems = new Collection<string>(); 
     myMthod(ref myitems); 
     Console.WriteLine(myitems.Count.ToString()); 
     Console.ReadLine(); 
    } 

    static void myMthod(ref Collection<string> myitems) 
    { 
     myitems.Add("string"); 
     if(myitems.Count <5) 
      myMthod(ref myitems); 
    } 
} 

जैसा कि @ ज़ोबा द्वारा निर्धारित किया गया है, रेफरी द्वारा पास करना आवश्यक नहीं है, यदि आप मूल्य से गुजरते हैं तो यह भी काम करेगा।

+0

मुझे लगता है कि चेतावनी में शामिल हैं() फ़ंक्शन जिसे मुझे डुप्लिकेट की जांच करने की आवश्यकता है, क्योंकि इसे हर बार पूरी सूची में चलना पड़ता है। लेकिन एक रेफरी के रूप में गुजरना ओवरहेड को कम करने के लिए काम कर सकता है। –

+0

रेफरी के रूप में पास करने से कोई फर्क नहीं पड़ता है जब तक कि आप myitems को कोई नई ऑब्जेक्ट निर्दिष्ट न करें। बस मूल्य से गुजरना काम करेगा (मान ऑब्जेक्ट का संदर्भ है, रेफरी ऑब्जेक्ट के संदर्भ वाले वेरिएबल का संदर्भ है)। – Zooba

0

जहां तक ​​विलय हो जाता है:

मुझे आश्चर्य है, वहाँ एक और अधिक कुशल तरह से एक पुनरावर्ती समारोह है कि डुप्लिकेट के बिना स्ट्रिंग की एक सूची देता है? मुझे संग्रह का उपयोग करने की आवश्यकता नहीं है, यह उपयुक्त डेटा प्रकार बहुत अधिक हो सकता है।

आपका फ़ंक्शन एक वापसी मूल्य एकत्र करता है, है ना? आप आपूर्ति की गई सूची को आधा में विभाजित कर रहे हैं, फिर से स्वयं को दोहरा रहे हैं (दो बार) और फिर उन परिणामों को विलय कर रहे हैं।

विलय चरण के दौरान, परिणामस्वरूप प्रत्येक स्ट्रिंग को जोड़ने से पहले जांच न करें? यदि यह पहले से ही है, तो इसे छोड़ दें।

मान लीजिए कि आप निश्चित रूप से क्रमबद्ध सूचियों के साथ काम कर रहे हैं।

संबंधित मुद्दे