如何使用Linq C#对可变数量的列进行排序?

时间:2019-05-28 16:05:52

标签: c# sorting

以下代码可用于对两列进行排序(按姓氏然后按名),但是我需要按可变数量的名称(每个条目2-5)进行排序。在空白处添加另一个ThenBy拆分会导致超出范围的异常。我知道为什么,但是我想知道是否有任何办法可以使代码与Linq一起使用,或者是否需要其他方法。抱歉,如果这很简单,我对C#完全陌生。我已经搜索了一段时间了,但找不到答案。

下面的代码输出到控制台:

Jimbo Crab
Jonathan Crab
Michael Crab
Steve Cruthers
Barry John
David Johnson

首先按姓氏,然后按给定名称正确排序。

但是我需要排序的名称长度不同,即:

巴里·约翰
丹尼尔·约翰逊·詹姆斯
史蒂夫·戴维森·安德鲁·科林斯
罗娜·迈克尔

哪个应该产生:

Steve Davidson Andrew Colins
Daniel Johnson James
Barry John
Lorna Michael

这些需要以相反的顺序进行排序,因此,先按姓氏,然后再给定名称,最后是姓氏。

谢谢!

var listStr = new[] {
    "Barry John", "Steve Cruthers", "Michael Crab", "David Johnson", "Jonathan Crab", "Jimbo Crab"};

     var sorted = listStr
     .OrderBy(s => s.Split(' ')[1])
     .ThenBy(s => s.Split(' ')[0]);

     foreach (var s in sorted)
     {
         Console.WriteLine(s);
     }
}

1 个答案:

答案 0 :(得分:1)

拆分每个字符串一次,然后使用数组进行排序更容易,更高效。最后,如果需要,您可以将数组连接回字符串。

var sorted = listStr
    .Select(s => s.Split(' ')) // project string to an array
    .OrderBy(a => a[a.Length - 1]) // order by last element
    .ThenBy(a => a.Length > 2 ? a[1] : a[0]) // then order by middle element
    .ThenBy(a => a[0]) // then order by first element
    .Select(a => String.Join(" ", a)); // project back to a string