包含以下划线开头的字符串的列表排序

Posted

技术标签:

【中文标题】包含以下划线开头的字符串的列表排序【英文标题】: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 表中的大写字母和小写字母之间。

【问题讨论】:

“_”是你唯一的特殊字符吗?您还有什么其他要求? 另外,你想区分大小写吗?我猜是这样,但不清楚。 【参考方案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 将不受影响。

【讨论】:

以上是关于包含以下划线开头的字符串的列表排序的主要内容,如果未能解决你的问题,请参考以下文章

无效的字段名称“名称”。字段只能包含字母、数字和下划线,以字母或下划线开头,最多 128 个字符

求一个正则表达式: 以英文字母开头,只能包含英文字母、数字、下划线

python-字符串+变量

Unix下划线字符的排序处理

Ruby命名规范

求PHP用户名注册验证正则表达式(6-16位字符,字母开头,只包含字母数字下划线)可支持中文