以下代码可用于对两列进行排序(按姓氏然后按名),但是我需要按可变数量的名称(每个条目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);
}
}
答案 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