2016-03-01 108 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(词汇顺序)