2012-02-20 15 views
13

मैं इसस्ट्रिंग छँटाई मुद्दा

List<string> items = new List<string>(); 
    items.Add("-"); 
    items.Add("."); 
    items.Add("a-"); 
    items.Add("a."); 
    items.Add("a-a"); 
    items.Add("a.a"); 

    items.Sort(); 

    string output = string.Empty; 
    foreach (string s in items) 
    { 
     output += s + Environment.NewLine; 
    } 

MessageBox.Show(output); 

की तरह सूची है आउटपुट के रूप में

- 
. 
a- 
a. 
a.a 
a-a 

वापस आ रहा है, जहां के रूप में मैं के रूप में

- 
. 
a- 
a. 
a-a 
a.a 

किसी भी विचार के परिणाम की उम्मीद कर रहा हूँ क्यों "aa" "aa" से पहले नहीं आ रहा है, जहां "ए-" पहले "ए" से आता है।

उत्तर

4

आप सॉर्ट करने के लिए अपने स्ट्रिंग चाहते हैं वर्तमान बाइट वैल्यू पर आधारित वर्तमान संस्कृति द्वारा परिभाषित नियमों के विपरीत, आप साधारण द्वारा क्रमबद्ध कर सकते हैं:

items.Sort(StringComparer.Ordinal);

इससे सभी संस्कृतियों में परिणाम सुसंगत होंगे (लेकिन यह "9" से पहले आने वाले "14" की अनजान सॉर्टिंग का उत्पादन करेगा जो आप खोज रहे हैं या नहीं भी हो सकता है)।

+0

धन्यवाद जेरेड, क्या आप मुझे बता सकते हैं कि डेटा डेटाटेबल 'डेटाटेबल डेटाटेबल = नया डेटाटेबल() के कॉलम में डेटा कैसे सॉर्ट कर सकता है; डेटाटेबल। कॉलम। जोड़ें ("आइटम", टाइपऑफ (स्ट्रिंग)); डेटारो = डेटाटेबल.NewRow(); डेटारो ["आइटम"] = "ए-ए"; डेटाटेबल। पंक्तियां जोड़ें (डेटारो); डेटारो = डेटाटेबल.NewRow(); डेटारो ["आइटम"] = "ए.ए"; डेटाटेबल। पंक्तियां जोड़ें (डेटारो); डेटारो [] पंक्तियां = डेटाटेबल। चयन करें ("", "आइटम एएससी"); ' – Satya

4

List<> वर्ग के Sort विधि .नेट फ्रेमवर्क, जो वास्तव में Thread की वर्तमान CultureInfo का एक उदाहरण है के डिफ़ॉल्ट string comparer पर निर्भर करता है।

CultureInfo वर्णों के वर्णमाला क्रम को निर्दिष्ट करता है और ऐसा लगता है कि डिफ़ॉल्ट एक ऑर्डर का उपयोग कर रहा है जो आप उम्मीद करेंगे।

जब आप किसी विशिष्ट CultureInfo, एक है कि आप जानते हैं कि आपके छँटाई आवश्यकताओं से मेल होगा, नमूना (जर्मन संस्कृति) निर्दिष्ट कर सकते हैं छँटाई:

var sortCulture = new CultureInfo("de-DE"); 
items.Sort(sortCulture); 

अधिक जानकारी यहां पाया जा सकता:
http://msdn.microsoft.com/en-us/library/b0zbh7b6.aspx
http://msdn.microsoft.com/de-de/library/system.stringcomparer.aspx

+0

जो स्पष्ट नहीं है "-" (हाइफ़न) "।" (डॉट) और "ए" से पहले "ए" से पहले आ रहा है; "aa" से पहले 'aa' क्यों नहीं? – Satya

+0

सैद्धांतिक रूप से, वर्तमान संस्कृति '.' और' -' को एक ही क्रम के रूप में मान सकती है। '.ॉर्ट' विधि" अस्थिर "है, जिसका अर्थ है कि बराबर वस्तुओं का क्रम गारंटी नहीं है। –

+1

मैंने यूएस अंग्रेज़ी पर परीक्षण किया और ओपी के समान परिणाम प्राप्त किए। स्ट्रिंग.कंपारे का उपयोग करते समय भी मुझे 0 (बराबर) नहीं मिला। मुझे या तो -1 या 1 मिला, जिस पर पहले था। यह शायद .Sort विधि के साथ कोई समस्या नहीं है। –

15

मुझे संदेह है कि पिछले मामले में "-" संस्कृति-विशिष्ट सेटिंग्स (शायद पहले "तारों" के विपरीत "डैश" के विपरीत) के रूप में अलग-अलग तरीके से व्यवहार किया जाता है। MSDN warns इस बारे में:

तुलना प्राप्त करने के लिए वर्तमान संस्कृति का उपयोग करता है संस्कृति विशिष्ट ऐसे आवरण नियमों और अलग-अलग पात्रों की वर्णमाला क्रम के रूप में जानकारी। उदाहरण के लिए, एक संस्कृति निर्दिष्ट कर सकती है कि वर्णों के कुछ संयोजनों को एक वर्ण के रूप में माना जा सकता है, या अपरकेस और लोअरकेस वर्णों की तुलना किसी विशेष तरीके से की जाती है, या किसी वर्ण का क्रमबद्ध क्रम वर्ण पर निर्भर करता है जो पहले या इसका पालन करें।

इसके अलावा this MSDN page में देखें: शब्द प्रकार, स्ट्रिंग प्रकार, और क्रमसूचक प्रकार:

.नेट फ्रेमवर्क छँटाई के पास तीन अलग तरीके का उपयोग करता है। शब्द सॉर्ट एक संस्कृति-संवेदनशील तारों की तुलना करता है। कुछ nonalphanumeric वर्णों में उन्हें निर्दिष्ट विशेष वजन हो सकता है; उदाहरण के लिए, हाइफ़न ("-") में बहुत छोटा वजन दिया जा सकता है ताकि "कोऑप" और "सह-सेशन" क्रमबद्ध सूची में एक दूसरे के बगल में दिखाई दे। स्ट्रिंग सॉर्ट शब्द सॉर्ट के समान है, सिवाय इसके कि कोई विशेष मामला नहीं है; इसलिए, सभी nonalphanumeric प्रतीक सभी अल्फान्यूमेरिक वर्णों से पहले आते हैं। सामान्य क्रम स्ट्रिंग के प्रत्येक तत्व के यूनिकोड मानों के आधार पर तारों की तुलना करता है।

तो, शब्द को अधिक "प्राकृतिक" बनाने के लिए, हाइफ़न को डिफ़ॉल्ट सॉर्ट मोड में एक विशेष उपचार मिलता है।

यदि आप विशेष रूप से इसे चालू "सामान्य" क्रमसूचक प्रकार प्राप्त कर सकते हैं:

 Console.WriteLine(string.Compare("a.", "a-"));     //1 
    Console.WriteLine(string.Compare("a.a", "a-a"));    //-1 

    Console.WriteLine(string.Compare("a.", "a-", StringComparison.Ordinal)); //1 
    Console.WriteLine(string.Compare("a.a", "a-a", StringComparison.Ordinal)); //1 

क्रमसूचक तुलना उपयोग का उपयोग कर मूल संग्रह क्रमबद्ध करने के लिए:

 items.Sort(StringComparer.Ordinal); 
+0

मुझे लगता है कि आपने इसे क्रैक किया है, शब्द सॉर्ट यहां समस्या है। – ntziolis

+0

@ntziolis: ऐसा लगता है कि यह सी है वास्तव में –

+0

यदि डेटा डेटाटेबल – Satya

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