2012-11-02 10 views
5

मैं दो SortedLists विलय करने वाले कोड का एक टुकड़ा तेज़ करने की तलाश में हूं।सी # दो सॉर्ट किए गए लिस्ट (यूनियन?) मर्ज करें

सी # 4.0 जेनेरिक SortedList: http://msdn.microsoft.com/en-us/library/ms132319(v=vs.100).aspx

public Trait getTrait(decimal thisValue) 
{  
    if (ParentStructure != null && ParentStructure.RankedTraits.Count > 0) 
    { 
     SortedList<decimal, Trait> tempTraits = this.RankedTraits; 

     // Improve here (union?) 
     foreach (KeyValuePair<decimal, Trait> kvp in (ParentStructure.RankedTraits)) 
     { 
      if (!tempTraits.ContainsKey(kvp.Key)) 
      { 
       tempTraits.Add(kvp.Key, kvp.Value); 
      } 
     } 
     return _getTrait(tempTraits, thisValue); 
     } 
    } 
    return _getTrait(_rankTraits, thisValue); 
} 

मैं सोच रहा हूँ कि एक संघ के बजाय foreach पाश तेजी से होगा, लेकिन मैं कैसे एक SortedList पर एक संघ को लागू करने की पता नहीं है। अगर कोई मेरी मदद कर सकता है तो मैं इसकी सराहना करता हूं।

इसके अलावा, अगर कुल मिलाकर बेहतर तरीका है तो मैं सुझावों के लिए खुला हूं।

+1

बस एक विचार है, लेकिन के अनुसार [इस उत्तर] (http://stackoverflow.com/a/1754080/551322), यदि आप प्रकार इनपुट संग्रह मदद कर सकता है। – nrodic

+0

धन्यवाद, डेटा इनपुट इनपुट क्रमबद्ध सूचियों से आ रहा है, जिससे इसे पूर्व निर्धारित किया जाना चाहिए - हालांकि यह देखकर कि मैं सॉर्टेड डिक्शनरी पर स्विच करना चाहता हूं। –

+0

आप इस कोड को गति देने के लिए क्यों देख रहे हैं? क्या यह खराब प्रदर्शन करता है? – Enigmativity

उत्तर

2

एकमात्र तरीका है कि मैं दो SortedList उदाहरणों को विलय करने के बारे में सोच सकता हूं, उन्हें एक संघ में परिवर्तित करना होगा, फिर एक लुकअप में कनवर्ट करना होगा, फिर शब्दकोश बनाने के लिए लुकअप संग्रह का पहला तत्व लें।

मुझे एक शब्दकोश बनाना होगा क्योंकि SortedList केवल एक-एक-एक जोड़ों का समर्थन करता है। तो एकमात्र अन्य विकल्प SortedList कन्स्ट्रक्टर में एक शब्दकोश को इंजेक्ट करना होगा।

निष्कर्ष: किसी भी मुझे लगता है कि अपने वर्तमान कोड सुंदर सभ्य यह है के रूप में है। LINQ कोड को लगभग 2 लाइनों तक कम करने में मदद कर सकता है (या यदि आप एक मासोचिस्ट हैं)।

SortedList<decimal, Traits> listA = new SortedList<decimal, Traits>(); 
SortedList<decimal, Traits> listB = new SortedList<decimal, Traits>(); 

listA.Add(1m, new Traits { FieldName = "One" }); 
listA.Add(2m, new Traits { FieldName = "Two" }); 
listA.Add(3m, new Traits { FieldName = "Three" }); 

listB.Add(1m, new Traits { FieldName = "One" }); 
listB.Add(4m, new Traits { FieldName = "Four" }); 
listB.Add(5m, new Traits { FieldName = "Five" }); 

var listUnion = listA.Union(listB).ToLookup(k => k.Key, v => v.Value) 
        .ToDictionary(k => k.Key, v => v.First()); 
var listMerged = new SortedList<decimal, Traits>(listUnion); 
+0

धन्यवाद - जो यूनियनों के बारे में मेरे सवालों के जवाब देता है - हालांकि यह मेरे कोड को तेज़ नहीं बनाता है (शायद इसे वापस सॉर्ट किए गए सूची में परिवर्तित करने के कारण) इसलिए मैं इसका उपयोग नहीं करूँगा। एक बार फिर धन्यवाद! –

+0

हाँ, मैंने भी ऐसा सोचा। मुद्दा यह है कि 'SortedList.Union'' IEqualityComparer' का सम्मान नहीं करता है।यदि ऐसा होता है, तो यह ** थोड़ा और अधिक प्रदर्शनकारी हो सकता है, क्योंकि लुकअप में रूपांतरण शब्दकोश के बाद के रूपांतरण को प्रभावित करेगा। यह भी बेकार है कि 'सॉर्टेड लिस्ट' एक समय में केवल एक की बजाय 'KeyValuePairs 'की सीमा को जोड़ने का समर्थन नहीं करता है। – code4life

+0

हाँ, यह वास्तव में मूल कोड की तुलना में बहुत अधिक लूपिंग करता है, क्योंकि यह पृष्ठभूमि में लिनक्स करता है। – theMayer

1

सॉर्टेडसेट में एक यूनियनविथ विधि है जो आप पूछ रहे हैं। मैंने सॉर्टेडसेट का अपना कार्यान्वयन बनाया और यह बहुत तेज़ी से प्रदर्शन करता है।

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

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

+0

धन्यवाद, लेकिन सॉर्टेडसेट और सॉर्टेडलिस्ट एक ही चीज़ नहीं हैं। यह कुंजी/मान है जो मुझे गड़बड़ कर रहा है और सॉर्टेडसेट में कोई कुंजी नहीं है। - मैं भी इसे लागू करने के तरीके पर कुछ उदाहरण प्राप्त करने की उम्मीद कर रहा हूं। मैं अपनी खोज कर सकता हूं। –

+0

वास्तव में, मेरी माफ़ी। हालांकि, अपने उदाहरण कोड को देखते हुए, क्या आप डुप्लीकेट को खत्म करने की कोशिश कर रहे हैं? – theMayer

+0

कोई डुप्लीकेट कुंजी नहीं - मुझे विश्वास नहीं है कि सॉर्टेडलिस्ट में डुप्लिकेट कुंजी हो सकती है। डुप्लिकेट मान ठीक हैं। –