2016-03-01 204 views
0

我對字符串進行排序的代碼:字典順序排序C#

class Program 
{ 
    static void Main() 
    { 

     int x = Convert.ToInt32(Console.ReadLine()); 
     List<string> sampleList = new List<string>(); 

     for (int i=0; i<x; i++) 
     { 
      string word = Console.ReadLine(); 
      sampleList.Add(word); 
     } 


     foreach (string s in SortByLength(sampleList)) 
     { 
      Console.Write(s); 
     } 
     Console.ReadLine(); 
    } 

    static IEnumerable<string> SortByLength(IEnumerable<string> e) 
    { 
     // Use LINQ to sort the array received and return a copy. 
     var sorted = from s in e 
        orderby s.Length descending 
        select s; 
     return sorted; 
    } 
} 

此代碼排序的長字符串,我怎麼能做到這一點的長度和字典順序?

//Input 
4 
abba 
abacaba 
bcd 
er 

//Output 
abacabaabbabcder 

在這種情況下,做工精細,但當我有

//Input 
5 
abba 
ebacaba 
bcd 
er 
abacaba 

//Output 
ebacabaabacabaabbabcder 

我的第一個字符串是ebacaba這是不對的。

+1

你可以試試: 'VAR分類= e.OrderByDescending(X => X。長度).ThenBy(x => x).ToList()' –

+0

我不明白你想爲第二種情況(5輸入)實現的模式,介意給予預期的輸出? – Ian

回答

1

編輯:

默認情況下,非字符是詞法比字符小,因此,你可以利用這一點,並省略ThenBy但仍然會得到這樣的結果相同(幸得Matthew Watson) :

string str = "abba ebacaba bcd er abacaba output ebacabaabacabaabbabcder"; 
string[] strs = str.Split(' ').OrderBy(x => x).ToArray(); //same result, but shorter 

原文:

使用OrderByThenBy

string str = "abba ebacaba bcd er abacaba output ebacabaabacabaabbabcder"; 
string[] strs = str.Split(' ').OrderBy(x => x).ThenBy(x => x.Length).ToArray(); 

您將獲得:

abacaba //aba is earlier than abb 
abba 
bcd 
ebacaba 
ebacabaabacabaabbabcder 
er 
+1

我想你會得到完全一樣的輸出,如果你把'.ThenBy()'省略掉。 –

+0

@MthetheWWatson你是對的!我只是測試它。看起來像非字符在詞法上比字符小於字符 – Ian

+0

畢竟這是標準的字典順序。讓我想知道OP想要什麼......啊!剛剛實現!他想按照長度和按價值排序。 –

2

您可以使用thenby:

static IEnumerable<string> SortByLength(IEnumerable<string> e) 
{ 
    // Use LINQ to sort the array received and return a copy. 
    var sorted = e.OrderByDescending(s=>s.Length).ThenBy(r=>r);     
    return sorted; 
} 
+1

這似乎是正確的答案。 –

+0

是否可以添加如何按字典順序排序? – McStuffins

0

更改函數T:

static IEnumerable<string> SortByLength(IEnumerable<string> e) 
{ 
     // Use LINQ to sort the array received and return a copy. 
     var sorted = from s in e 
        orderby s.Length descending, s 
        select s; 
     return sorted; 
    } 

將輸出:

abacabaabbabcder 
abacaba 
output 
abb 
bcd 
edr 

new List<string>{"abb", "abacaba", "bcd", "edr", "output", "abacabaabbabcder"}

使用,因爲它會通過s.Length訂貨,再由S(詞彙順序)