2009-07-02 11 views
7

किसी को भी मदद कर सकते हैं .. मैं की तरह एक सामान्य सूची है तोकिसी सूची को सॉर्ट करना <> मेरे कस्टम ऑर्डर के साथ जो किसी अन्य सूची (सी #) में संग्रहीत है?

IList<itemTp> itemTps; 

itemTp मूल रूप से एक वर्ग है और इस पर एक संपत्ति है "कोड"

मैं करने की आवश्यकता है (गुण की एक संख्या है) है इसे एक विशिष्ट क्रम को सॉर्ट करने में सक्षम है जिसे मैंने दूसरी सूची में सेट किया है।

इस सूची में एक सरल सूची है कि आदेश (पहली से शुरू पिछले) को सूचीबद्ध करता है की तरह कहते हैं कि

code1 code3 code2 code5 (नोटिस यह 2 से 5 के लिए 1 से 3 तक चला जाता है - इन कर रहे हैं नाम, उन्हें कुछ भी कहा जा सकता है .. महत्वपूर्ण बात यह है कि ऑर्डर के साथ कुछ भी नहीं है)

असल में मुझे अन्य सूची में मौजूद चीज़ों के अनुसार आइटम टीपी क्रम में आइटम सुनिश्चित करने की आवश्यकता है ...

तो कल्पना मेरी IList इस code1, code2, code3, code5 की तरह है - इसलिए एक बार प्रकार में किया जाता है मेरी

 IList<itemTp> 

4 वर्गों है कि क्रम में हैं और code1, code3, code2, code5 तरह संपत्ति है में शामिल होंगे (ऑर्डर चेंज)

कोई विचार यह कैसे करें?

उत्तर

9

आपको एक आईसीओएमपेयर बनाने की आवश्यकता होगी जो आपकी अन्य सूची की स्थिति के आधार पर वस्तुओं की तुलना करेगी। एक आईसीओएमपेयर का उपयोग करने का लाभ यह है कि यदि आप उस अनुकूलन की आवश्यकता है तो आप बार-बार इंडेक्सऑफ() लुकअप से बचने के लिए अपनी कक्षा में कैशिंग लॉजिक बनाने में सक्षम होंगे। साथ ही, आप कई "अन्य" सूचियों को बनाए रखने में सक्षम होंगे जिनका उपयोग उचित होने पर किया जा सकता है।

class ItemTpComparer : IComparer<itemTp> 
{ 
    private IList<codeTp> otherList; 

    public ItemTpComparer(IList<codeTp> otherList) 
    { 
     this.otherList = otherList; 
    } 

    public int Compare(itemTp a, itemTp b) 
    { 
     return otherList.IndexOf(a.Code) - otherList.IndexOf(b.Code); 
    } 
} 

और तरह प्रदर्शन करने के लिए:

myList.Sort(new ItemTpComparer(otherList)); 
+0

मैं नहीं कहूंगा कि एक फायदा है। आप प्रतिनिधि को उसी उदाहरण विधि में पास कर सकते हैं जैसे आप इंटरफ़ेस पास करते हैं, और आपके पास कोई तर्क है जो आप चाहते हैं। – Groo

+0

यह बहुत अच्छा लग रहा है, सिर्फ एक सवाल है, आप इंडेक्सऑफ में अन्य सूची पर ए और बी पास कर रहे हैं ... तो अगर मेरे पास "टेस्टमेनो" और "टेस्टमेटर" था तो क्या होगा .. इंडेक्स प्रत्येक के लिए 6 वापस नहीं जा रहा है ?? –

+0

मुझे आपकी टिप्पणी समझ में नहीं आ रही है। यदि TestMeNow और TestMeLater अन्य सूची में हैं, तो वे दोनों इंडेक्स 6 पर नहीं हो सकते हैं। – anthony

0

क्षमा करें अगर कुछ गलत है, मैं एक सी # यहाँ स्थापित संपादक नहीं है, लेकिन यह कुछ इस तरह है:

Array.Sort(
    itemTps, 
    delegate(ItemTp a, ItemTp b) 
    { 
      return secondList.IndexOf(a.Code) - secondList.IndexOf(b.Code); 
    }); 

नोट: यह सबसे कारगर तरीका नहीं हो सकता है, और यह भी कोई यह जांचना कि दूसरी सूची में कोड शामिल है या नहीं।

[संपादित करें] रूप Mehrdad कहा, Array.Sort सामान्य IList<T> के लिए काम नहीं करता। सरणी को जगह में सॉर्ट करने के लिए, आपको रैपर बनाने के लिए ArrayList.Adapter विधि का उपयोग करने की आवश्यकता होगी, और उसके बाद इसे सॉर्ट करें। चूंकि ArrayList.Sort प्रतिनिधि तुलना का समर्थन नहीं करता है, इसलिए आपको अज्ञात प्रतिनिधि को IComparer<T> के कार्यान्वयन के अंदर रखना होगा।

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

+0

सरणी।सॉर्ट जेनेरिक IList

+0

हाँ पर काम नहीं करेगा .. मैं केवल तुलनाकर्ता के बारे में सोच रहा था। यहां यह है: http://stackoverflow.com/questions/15486/sorting-an-ilist-in-c – Groo

0

सी # 3 और वस्तुओं को LINQ का उपयोग करना, मैं सिर्फ बजाय सॉर्ट करने के लिए मौजूदा एक कोशिश कर के एक नई सूची बनाने होगा:

void Example() 
{ 
    IList<string> codes; 
    IList<ItemTp> itemTps; 
    itemTps = codes.Select(code => itemTps.Single(itp => itp.Code == code)).ToList(); 
} 
संबंधित मुद्दे