【问题标题】:List sorting which contains string starting with underscore包含以下划线开头的字符串的列表排序
【发布时间】:2013-09-01 21:54:42
【问题描述】:

这就是我得到的: 我有一个包含以下字符串的列表:“student”、“Students”、“students”、“Student”和“_Students”。

我做了什么:

List<string> sort = new List<string>() { "student", "Students", "students", "Student","_Students" };
List<string> custsort = sort.OrderBy(st => st[0]).ThenBy(s => s.Length)
                                                             .ToList();

但这给了我这种感觉:

Student
Students
_Students
student
students

而我想要的是:

_Students
Student
Students
student
students

我不知道如何对它们进行排序,因为该死的下划线位于 ASCII 表中的大写字母和小写字母之间。

【问题讨论】:

  • “_”是你唯一的特殊字符吗?您还有什么其他要求?
  • 另外,你想区分大小写吗?我猜是这样,但不清楚。

标签: c# list sorting criteria collation


【解决方案1】:

例如,您可以将_ 视为(space),如下所示:

List<string> custsort = sort.OrderBy(st => st.Replace('_', ' '))
                            .ToList();

这会将_Students 放在所有其他*students 之前...此时按ThenBy(s =&gt; s.Length) 排序将毫无用处。

如果您已经有以空格开头的字符串,这显然会造成一点混乱。如果你有它们,用另一个字符改变空格。

【讨论】:

    【解决方案2】:

    您可以使用仅返回 true 或 false 的排序标准 - 任何为 false 的项目都放在任何真正的项目之前。在下面的代码中,我添加了第一个 OrderBy,它将以下划线开头的项目放在首位。

    List<string> custsort = sort.OrderBy(st => st[0] != '_')
                            .ThenBy(st => st[0])
                            .ThenBy(s => s.Length)
                            .ToList();
    

    查询的其余部分使用与之前相同的规则 - 按第一个字符排序,然后按每个字符串的长度。

    【讨论】:

      【解决方案3】:

      您可以使用正则表达式来确定第一个字符是否为字母并对其应用权重。

      int GetWeight(char c)
      {
          return Regex.IsMatch(c.ToString(), @"[a-zA-Z]") ? c : 0;
      }
      
      List<string> sort = new List<string>() { "student", "Students", "students", "Student","_Students" };
      List<string> custsort =
          sort.OrderBy(st => GetWeight(st[0]))
              .ThenBy(s => s.Length)
              .ToList();
      

      这样,如果您需要任何其他特殊规则,您可以修改 GetWeight 函数,您的 Linq 将不受影响。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-15
        • 2016-01-14
        • 2014-11-02
        • 2012-05-28
        • 1970-01-01
        • 2023-03-16
        • 2014-05-21
        相关资源
        最近更新 更多