2010-06-23 3 views
11

मैं खुद को मार रहा हूं और इस सरणी को क्रमबद्ध करने की कोशिश कर रहा हूं।विंडोज एक्सप्लोरर (संख्यात्मक रूप से और वर्णानुक्रम) जैसे फ़ोल्डर नामों की एक सरणी को सॉर्ट करना - VB.NET

मेरे पास एक निर्देशिका है जिसमें उत्पन्न निर्देशिकाएं हैं;

मंद फ़ोल्डर() स्ट्रिंग = Directory.GetDirectories (RootPath)

के रूप में मैं उन्हें हल हो ताकि वे Win7/Vista में Windows Explorer में तरह दिखाई की जरूरत है। - फ़ोल्डर नामों से संख्यात्मक और वर्णानुक्रम।

फ़ोल्डर नामों में अक्षर और संख्या दोनों होते हैं, कभी-कभी केवल अक्षर या संख्याएं होती हैं।

सरल Array.Sort (फ़ोल्डर)

C:\inetpub\wwwroot\rootpath\1 
C:\inetpub\wwwroot\rootpath\10 
C:\inetpub\wwwroot\rootpath\100 
C:\inetpub\wwwroot\rootpath\1004 
C:\inetpub\wwwroot\rootpath\101 
C:\inetpub\wwwroot\rootpath\11 
C:\inetpub\wwwroot\rootpath\12 
C:\inetpub\wwwroot\rootpath\2 
C:\inetpub\wwwroot\rootpath\3 
C:\inetpub\wwwroot\rootpath\4 
C:\inetpub\wwwroot\rootpath\5 
C:\inetpub\wwwroot\rootpath\6 
C:\inetpub\wwwroot\rootpath\7 
C:\inetpub\wwwroot\rootpath\8 
C:\inetpub\wwwroot\rootpath\87skjnd 
C:\inetpub\wwwroot\rootpath\89sdf93kmw3 
C:\inetpub\wwwroot\rootpath\9 
C:\inetpub\wwwroot\rootpath\ad 
C:\inetpub\wwwroot\rootpath\bin 
C:\inetpub\wwwroot\rootpath\dark 
C:\inetpub\wwwroot\rootpath\erk 
C:\inetpub\wwwroot\rootpath\jkh23978yoaslkd3 
C:\inetpub\wwwroot\rootpath\lk2309as 
C:\inetpub\wwwroot\rootpath\work 
C:\inetpub\wwwroot\rootpath\zone 

में परिणाम क्या मैं के लिए (और क्या Windows Explorer प्रदर्शित करता है) है चाहता हूँ ...

C:\inetpub\wwwroot\rootpath\1 
C:\inetpub\wwwroot\rootpath\2 
C:\inetpub\wwwroot\rootpath\3 
C:\inetpub\wwwroot\rootpath\4 
C:\inetpub\wwwroot\rootpath\5 
C:\inetpub\wwwroot\rootpath\6 
C:\inetpub\wwwroot\rootpath\7 
C:\inetpub\wwwroot\rootpath\8 
C:\inetpub\wwwroot\rootpath\9 
C:\inetpub\wwwroot\rootpath\10 
C:\inetpub\wwwroot\rootpath\11 
C:\inetpub\wwwroot\rootpath\12 
C:\inetpub\wwwroot\rootpath\87skjnd 
C:\inetpub\wwwroot\rootpath\89sdf93kmw3 
C:\inetpub\wwwroot\rootpath\100 
C:\inetpub\wwwroot\rootpath\101 
C:\inetpub\wwwroot\rootpath\1004 
C:\inetpub\wwwroot\rootpath\ad 
C:\inetpub\wwwroot\rootpath\bin 
C:\inetpub\wwwroot\rootpath\dark 
C:\inetpub\wwwroot\rootpath\erk 
C:\inetpub\wwwroot\rootpath\jkh23978yoaslkd3 
C:\inetpub\wwwroot\rootpath\lk2309as 
C:\inetpub\wwwroot\rootpath\work 
C:\inetpub\wwwroot\rootpath\zone 

मैं googled और है कि पता चला एक वर्ग को लिखा जाना चाहिए जो तत्वों को क्रमबद्ध करने के लिए IComparable का उपयोग करता है। एक सुपरनेवी होने के नाते ... मैं वास्तव में नहीं जानता कि यह कैसे किया जा सकता है। मैंने देखा कि अधिकांश उदाहरणों में बहु आयामी सरणी और चाबियां थीं: एस ...

भी अच्छा होगा अगर सॉर्टिंग फ़ाइल नामों (फ़ोल्डर्नम्स के बजाए) या दोनों फ़ोल्डरों और फ़ाइलों वाले सरणी पर लागू किया जा सके। । इस मामले में सॉर्ट किए गए फ़ोल्डर्स शीर्ष पर दिखाई देते हैं और नीचे दी गई फाइलें ... क्या यह भी संभव है?

किसी भी मदद की बहुत सराहना की जाएगी ...: डी धन्यवाद।

उत्तर

20

आपको आईसीओम्पेरिएबल लागू करने वाली कक्षा बनाने के विरोध में एक आईसीओएमपेयर लागू करने की आवश्यकता होगी। अंतर यह है कि एक आईसीओम्पियर के पास दो वस्तुओं की तुलना करने के लिए आवश्यक "ज्ञान" होता है जबकि आईसीओम्पेर्बल को एक वर्ग द्वारा कार्यान्वित किया जाता है जो जानता है कि किसी और चीज के खिलाफ खुद की तुलना कैसे करें।

और जिस तरह से विंडोज एक्सप्लोरर फ़ाइल नामों का प्रकार है, StrCmpLogicalW नामक फ़ंक्शन का उपयोग कर रहा है। विंडोज एक्सप्लोरर के समान व्यवहार करने के लिए आप इस फ़ंक्शन का उपयोग अपने स्वयं के आईसीओएमपेयर में कर सकते हैं। इस समारोह ताकि 9 प्रकार से पहले 10.

public class MyComparer : IComparer<string> { 

    [DllImport("shlwapi.dll", CharSet=CharSet.Unicode, ExactSpelling=true)] 
    static extern int StrCmpLogicalW(String x, String y); 

    public int Compare(string x, string y) { 
     return StrCmpLogicalW(x, y); 
    } 

} 

Array.Sort(unsortedNames, new MyComparer()); 

और क्योंकि संख्या के रूप में तार के संख्यात्मक भागों व्यवहार करता है मैं सिर्फ देखा प्रश्न टैग है वीबी ... मेरी जंग लगी वीबी माफ कर दो!

Public Class MyComparer 
    Implements IComparer(Of String) 

    Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" (_ 
     ByVal s1 As String, _ 
     ByVal s2 As String) As Int32 

    Public Function Compare(Byval x as String, Byval y as String) As Integer _ 
     Implements System.Collections.Generic.IComparer(Of String).Compare 

     Return StrCmpLogicalW(x, y) 

    End Function 

End Class 
+0

वाह .... वास्तव में अच्छा काम करता है ... धन्यवाद जोश! ... हालांकि एक चिंता हालांकि ... मैं जो काम कर रहा हूं उसे एक उत्पाद के हिस्से के रूप में बेचा जाएगा। अब यह लाइब्रेरी ASP.Net 2.0+ चलाने वाले सभी सर्वरों पर उपलब्ध होगी .. क्षमा करें अगर सवाल बेवकूफ लगता है। बस यह सुनिश्चित करना चाहता था कि मैं उन मामलों में समस्याओं में भाग नहीं पाऊंगा जहां यह पुस्तकालय उपलब्ध नहीं है। क्या यह जांचना संभव है कि यह पुस्तकालय मौजूद है या नहीं और फिर सॉर्टिंग लागू करें ... और यदि यह अस्तित्व में नहीं है तो छोड़ें। आपको बहुत धन्यवाद जोश ... मुझे अपने आप से बाहर निकालने के लिए वर्षों लगेगा। – Norman

+0

दस्तावेज़ पृष्ठ के अनुसार यह XP और ऊपर, और सर्वर 2003 और ऊपर समर्थित है।डाउन-स्तरीय प्लेटफ़ॉर्म के लिए मुझे लगता है कि आप एक कार्यान्वयन में स्वैप कर सकते हैं जो सादे अल्फा सॉर्टिंग का उपयोग करता है। – Josh

+0

कोड में एक छोटी सी समस्या थी (संभवतः वीबी में रूपांतरण की वजह से) लाइन 8 काम करता है; पब्लिक फ़ंक्शन तुलना (बायवेल एक्स ए स्ट्रिंग, बायवल वाई ए स्ट्रिंग) इंटीजर इम्प्लीमेंट्स सिस्टम के रूप में। चयन। जेनेरिक.इकोम्पियर (स्ट्रिंग का)। --- क्या पुस्तकालय मौजूद है या नहीं यह जांचने का कोई तरीका है? अगर आपको लगता है कि यह एक बेवकूफ सवाल धन्यवाद, नॉर्मन। – Norman

1

Array.Sort में एक आईसीओएमपेयर पैरामीटर भी है, यदि आप डिफ़ॉल्ट पसंद नहीं करते हैं तो आप सॉर्टिंग व्यवहार को ओवरराइड कर सकते हैं। Array.Sort Method (T[], IComparer) इसे कैसे करें

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