2012-11-16 36 views
5

के अनुसार एक स्ट्रिंग सरणी को सॉर्ट करना मैं जानना चाहता हूं कि मैं एक विशिष्ट स्ट्रिंग स्थिति के अनुसार स्ट्रिंग [] के आइटम कैसे क्रमबद्ध कर सकता हूं। {Xx - सी, xxxxx - बी, yyy - एक, mlllll - d}एक स्ट्रिंग स्थिति (सी #)

अपेक्षित उत्पादन:: - ""

इनपुट उदाहरण के लिए मैं-स्ट्रिंग द्वारा निम्नलिखित सरणी क्रमबद्ध करना चाहते हैं {yyy - एक, xxxxx - बी, xx - सी, mlllll - d}

क्या मैं अब तक है निम्नलिखित है:

public string[] SortByStringPos(string[] arr, string str, bool ascending) 
{ 
    if (ascending) 
    { 
     var result = from s in arr 
        where s.Length >= s.IndexOf(str) 
        orderby s[s.IndexOf(str)] ascending 
        select s; 

     return result.ToArray(); 
    } 
    else 
    { 
     var result = from s in arr 
        where s.Length >= s.IndexOf(str) 
        orderby s[s.IndexOf(str)] descending 
        select s; 

     return result.ToArray(); 
    } 
} 

किसी ने मुझे एक संकेत छोड़ सकते हैं ...?

+0

ऐसा लगता है कि पत्र -' 'के बाद आने से क्रमबद्ध करना चाहते हैं, -'' की स्थिति है जो एक ही है द्वारा नहीं सभी तारों में? – Esailija

+0

तो आप स्ट्रिंग सरणी को क्रमबद्ध करने के लिए स्ट्रिंग सरणी को क्रमबद्ध करना चाहते हैं, केवल स्ट्रिंग के अंतिम भाग के आधार पर? तो उदाहरण के लिए पहले 4 वर्णों को अनदेखा कर रहे हैं? (या आपके मामले में, बस "-" के पीछे का हिस्सा? " –

+0

ठीक है, मैं इसे स्पष्ट रूप से स्पष्ट नहीं कर रहा था। मैं स्ट्रिंग के भीतर सभी वस्तुओं को सॉर्ट करना चाहता हूं [] जहां कभी भी दिया गया स्ट्रिंग एक्स पहली बार होता है यदि एक्स किसी आइटम वाई में मौजूद नहीं है, तो बस नई स्ट्रिंग के अंत में वाई डालें []। मुझे उम्मीद है कि यह अब और स्पष्ट है ...? – oren

उत्तर

3

एक बेहतर प्रदर्शन और डिजाइन के लिए, मैं आप की सिफारिश का उपयोग करें:

public void SortByStringPos(string[] arr, string str, bool ascending) 
    { 
     Array.Sort(arr, new MyStrComparer("-", ascending)); 
    } 

    class MyStrComparer : Comparer<string> 
    { 
     string delimiter; 
     bool isAscending; 

     public MyStrComparer(string aStr, bool ascending) 
     { 
      delimiter = aStr; 
      isAscending = ascending; 
     } 

     public override int Compare(string x, string y) 
     { 
      var r = GetMySubstring(x).CompareTo(GetMySubstring(y)); 
      return isAscending ? r : -r; 
     } 

     string GetMySubstring(string str) 
     { 
      return str.IndexOf(delimiter) != -1 ? str.Substring(str.LastIndexOf(delimiter)) : string.Empty; 
     } 

    } 

तुम भी SortByStringPos विधि हटा सकते हैं और अपने कोड में कहीं से भी Array.Sort(arr, new MyStrComparer("-", ascending)); कॉल कर सकते हैं।

+0

hmmm प्राप्त करने का प्रयास कर रहे हैं ... इस स्निपेट का परिणाम सही नहीं था – oren

+0

@oren बस संपादित किया गया। मुझे लगता है कि अभी यह है। – LMB

+0

सिस्टम। ऑर्ग्यूमेंटऑटऑफरेंज एक्सेप्शन ... – oren

3
orderby x=>x.Substring(x.LastIndexOf('-')) 

मैं अनुमान

ताकि आप सामान्य तरीके से यह ऑर्डर करने के लिए की जरूरत है, तो आप orderBy की तरह उपयोग कर सकते हैं, .... thenBy

+0

काम नहीं करता है :-( – oren

+0

क्या आप समझा सकते हैं अधिक विशेष रूप से आप – m4ngl3r

2
static void Main() 
{ 
    var input = new[] { "xx - c", "xx - b", "yy - a", "ml - d", }; 
    var delimeter = "-"; 
    var isAscending = true; 

    var res = Sort(input, delimeter, isAscending); 
} 

static string[] Sort(string[] input, string delimeter, bool isAscending) 
{ 
    var withDelimeter = input.Where(p => p.Contains(delimeter)); 
    var withoutDelimeter = input.Except(withDelimeter); 

    Func<string, string> selector = p => p.Substring(p.IndexOf(delimeter)); 

    return 
     (
      isAscending 

       ? withDelimeter.OrderBy(selector) 
        .Concat(withoutDelimeter.OrderBy(p => p)) 

       : withoutDelimeter.OrderByDescending(p => p) 
        .Concat(withDelimeter.OrderByDescending(selector)) 
     ) 
     .ToArray(); 
} 
+0

जब इनपुट के भीतर एक स्ट्रिंग एक्स में डिलिमीटर नहीं होता है, तो यह खो जाएगा ... खराब :-( – oren

+0

लापता डिलीमीटर के लिए फिक्स्ड केस :) – maximpa

+0

ग्रेट, समाधान लगता है, धन्यवाद मैक्सिम! – oren

0

स्ट्रिंग के अंतिम भाग को प्राप्त करने के लिए Substring का उपयोग करें। LINQ प्रश्नों को चरण-दर-चरण बनाया जा सकता है। इस कोड को repetitions (= सूखी सिद्धांत, अपने आप को दोहराना नहीं) कम कर देता है:

var query = arr.Where(s => s.Contains(str)); 
Func<string,string> sortExpr = s => s.Substring(s.IndexOf(str)); 
if (ascending) { 
    query = query.OrderBy(sortExpr); 
} else { 
    query = query.OrderByDescending(sortExpr); 
} 
return query.ToArray(); 
संबंधित मुद्दे