3

所以这就是我得到的:我有一个包含这些字符串的列表:“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 表中的大写字母和小写字母之间。

4

3 回答 3

4

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

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 将不受影响。

于 2013-08-29T12:59:47.773 回答
1

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

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

这将把_Students所有其他的*students...在这一点上排序ThenBy(s => s.Length)是没用的。

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

于 2013-08-29T12:48:05.063 回答
0

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

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

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

于 2013-08-29T12:59:10.063 回答