2009-09-30 4 views
5

मैं कुछ तार है कि इस तरह डेटा होते हैं सॉर्ट करने के लिए एक आवश्यकता है:कुशलतापूर्वक यह निर्धारित करने के लिए कि कोई स्ट्रिंग किसी संख्या से शुरू होती है और फिर पहले गैर-संख्यात्मक वर्ण तक सभी निम्न संख्याएं प्राप्त करें?

var strings = new List<string>{"2009 Arrears","2008 Arrears","2008 Arrears Interest","2009 Arrears Interest"}; 

और वे चाहते हैं परिणाम इस तरह का आदेश दिया:

  1. "2009 बकाया"
  2. "2009 बकाया ब्याज"
  3. "2008 बकाया"
  4. "2008 बकाया ब्याज"

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

+0

आपको इसमें रुचि हो सकती है: http://stackoverflow.com/questions/248603/natural-sort-order-in-c –

उत्तर

7
public int GetLeadingNumber(string input) 
{ 
    char[] chars = input.ToCharArray(); 
    int lastValid = -1; 

    for(int i = 0; i < chars.Length; i++) 
    { 
     if(Char.IsDigit(chars[i])) 
     { 
      lastValid = i; 
     } 
     else 
     { 
      break; 
     } 
    } 

    if(lastValid >= 0) 
    { 
     return int.Parse(new string(chars, 0, lastValid + 1)); 
    } 
    else 
    { 
     return -1; 
    } 
} 

हालांकि इस सख्ती से सबसे कारगर होगा, नियमित अभिव्यक्ति अन्य पोस्टर द्वारा की पेशकश समाधान स्पष्ट रूप से अधिक संक्षिप्त है और साफ हो सकता है, पर निर्भर करता है: यहाँ एक विकल्प है कि अभी भी LINQ के साथ अच्छा और साफ रखा है स्ट्रिंग पर आप कितना प्रोसेसिंग करेंगे।

7

एक regex इस विभाजित हैं अच्छी तरह से:

var match = Regex.Match(text, @"^(\d+) (.*)$"); 

फिर match.Groups[0].Value वर्ष है, और match.Groups[1].Value शीर्षक ("बकाया राशि", "बकाया ब्याज", आदि)

आप LINQ का उपयोग कर सकते है क्रमबद्ध करने के लिए (वर्ष अवरोही, शीर्षक आरोही):

string[] titles = new[] { "2008 Arrears", "2009 Arrears" }; 

var sortedTitles = 
    from title in titles 
    let match = Regex.Match(title, @"^(\d+) (.*)$") 
    orderby match.Groups[0].Value descending, match.Groups[1].Value 
    select title; 

listBox.ItemsSource = sortedTitles.ToArray(); // for example 

एक रेगेक्स सबसे तेज़ समाधान नहीं हो सकता है;

var sortedTitles = 
    from title in titles 
    let year = new string(title.TakeWhile(ch => char.IsDigit(ch)).ToArray()) 
    let remainder = title.Substring(year.Length).Trim() 
    orderby year descending, remainder 
    select title; 
+0

ध्यान दें कि इस अभिव्यक्ति को किसी स्थान द्वारा संख्याओं का पालन करने की आवश्यकता होगी (जब तक Regex 'IgnoreWhitespace' विकल्प के साथ बनाया/लगाया गया है)। –

+0

हां - मुझे लगता है कि अंतरिक्ष स्ट्रिंग का एक गारंटीकृत तत्व है। –

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