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

标签 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);
     }
}

最佳答案

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

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

关于c# - 如何使用 Linq C# 对可变数量的列进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56346212/

相关文章:

c# - Marshal.PtrToStructure 访问冲突

javascript - 将应用程序 ID 动态传递给 fb.init()

django - 在 Django 的 ListView 中排序

ios - 当数组中有多个字典时,如何按升序创建数组

c++ - std::sort 自定义比较器

c# - Selenium:FindsBy 与集合

c# - 设计可从 F# 良好使用的 C# 库的指南

c# - 链接描述被截断

arrays - Commodore 4.0 basic 中对字符串数组进行冒泡排序?

php - 对 laravel 关系集合的自定义排序