2

我有这个用于排序字符串的代码:

 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,这是错误的。

4

3 回答 3

5

编辑:

默认情况下,非字符在词法上小于字符,因此,您可以利用它并省略它,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
于 2016-03-01T15:53:22.370 回答
4

您可以使用 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;
}
于 2016-03-01T15:54:59.143 回答
1

改变你的函数 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(词法顺序)

于 2016-03-01T15:56:47.703 回答